home *** CD-ROM | disk | FTP | other *** search
/ Eagles Nest BBS 8 / Eagles_Nest_Mac_Collection_Disc_8.TOAST / Developer Tools⁄Additions / InsideBa1994 / InsideBasic-94 / IB 94 / BTerm / BTerm1.6bas next >
Text File  |  1991-09-24  |  73KB  |  2,165 lines

  1. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  2. '         A complete terminal program in ZBASIC 5.01
  3. '          BTerm Copyright 1991 by Mel Patrick
  4. '                 All rights reserved
  5. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  6. '
  7. DEF OPEN="CNFGBTRM"
  8. WINDOW OFF:COORDINATE WINDOW
  9. DEF MOUSE=-1:CURSOR 4:WIDTH -2
  10. '
  11. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  12. 'Resources
  13. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  14. Hndl& = FN GETRESOURCE(CVI("BTRM"),0)
  15. LONG IF Hndl& = 0
  16.    ResRef = FN OPENRESFILE("BTerm1.res")
  17. END IF
  18. '
  19. '
  20. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  21. 'Equates
  22. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  23. DIM T,L,B,R:'                                Generic rectangles
  24. DIM My,Mx,GlobalY,GlobalX,LocalY,LocalX:'          Mouse points
  25. DIM Ft,Fl,Fb,Fr,Fy,Fx:'              Rect & point for functions
  26. DIM Mt,Ml,Mb,Mr:'                     for auto cursor functions
  27.     True = NOT(False)
  28. DIM KeyRecord(7):'            Record structure for keyboard map
  29. '                          Record structure for font dimensions
  30. DIM FAsc,FDes,FWid,FLead,Fht
  31. DIM 40 BtnName$,40 CtrlTitle$:'  Simple string for button names
  32. DIM 1 Cr$:Cr$= CHR$(13):'                      Return character
  33. DIM 1 Q$ :Q$ = CHR$(34):'                            Quote mark
  34. DIM PenSpecs$:'                          Holds current pen data
  35. '
  36. '                    Record structure for sysEnvirons procedure
  37. DIM EnvVersion,MachineType,SystemVersion,Processor
  38. DIM HasFPU,KeyBoardType,AtDrvrVersNum,SysVRefNum
  39. '                         Request environment info from toolbox
  40.     OsErr = FN SYSENVIRONS(1,VARPTR(EnvVersion))
  41.     ColorQD = HasFPU AND 1
  42. '
  43. DIM Red,Green,Blue:'                                 RGB record
  44. DIM RFore,GFore,BFore:'        Structure to hold foreground RGB
  45. DIM RBack,GBack,BBack:'        Structure to hold background RGB
  46. '
  47. DIM ScrnT,ScrnL,ScrnB,ScrnR:'               Rect of main screen
  48.     CALL GETWMGRPORT(WMgrPort&):'       Ptr to desktop grafport
  49. '                                 Move its rect to my structure
  50.     BLOCKMOVE WMgrPort&+8,VARPTR(ScrnT),8
  51. '
  52.     Arrow       =  0:IBeam     =  1:'                   Cursors
  53.     CrossHair   =  2:Plus      =  3
  54.     Watch       =  4:Hand      = 1000
  55.     Ball        =  1001:' my spinning beach ball cursor
  56. '
  57.     ButtonAct   =  1:FieldAct  =  2:'             Dialog events
  58.     WindowAct   =  3:CloseAct  =  4
  59.     RefreshAct  =  5:ReturnAct =  6
  60.     TabAct      =  7:ZoomInAct =  8
  61.     ZoomOutAct  =  9:ShTabAct  = 10
  62.     ClearAct    = 11:LeftAct   = 12
  63.     RightAct    = 13:UpAct     = 14
  64.     DownAct     = 15:KeyAct    = 16
  65.     DiskAct     = 17
  66. '
  67.  
  68. '
  69. DIM Stak(20):'                                   My event stack
  70.     StakHi = 20:'                            Max items on stack
  71.     SP = 0:'                                      Stack pointer
  72.     OpenEvent  = 1:'                   Request to open a window
  73.     CloseEvent = 2:'            Request that a window be closed
  74.     MenuEvent  = 3:'        Request that menu be de-highlighted
  75.     BreakEvent = 4:'         Request that program be terminated
  76. '
  77.     COMWIN = 1
  78.     TSWIN = 2
  79.     CSWIN = 3
  80.         SNDWIN = 4
  81.     RECWIN = 5
  82.     PROSET=6
  83.     ABTWIN = 7
  84. '
  85. DATA 2,1,2,1,2,1,0,0,0,2:' Terminal settings TBut
  86. DATA 1,1,2,1,1,1,1,1,2,2,1,2,1,1,2,1:' Uart settings Cbut
  87. DATA 1,1,2,1,1,2,1:' Transfer Settings Pbut
  88. '
  89. DIM Tbut(10):FOR T=1 TO 10:READ Tbut(T):NEXT T: ' PROGRAMS DEFAULT TERM SETTINGS
  90. DIM Cbut(16):FOR T=1 TO 16:READ Cbut(T):NEXT T: ' Program in Com settings
  91. DIM Pbut(7):FOR T=1 TO 7:READ Pbut(T):NEXT T:'   program in transfer settings
  92. DIM Hold(16):' For holding temp items in CLICK dialogs
  93. '
  94. DIM Paramblock$,PBlock$:' used for file location and finder info
  95. DIM 82 Screen$(75):' for holding screen data in case of redraw
  96. '
  97. RECV$=STRING$(200," "):' xmodem buffer for incoming/out going
  98. '
  99. Soh=1:Ack=6:Can=24:Nak=21:Eot=4:' used to signal xmodem routines
  100. CtrlS=19:CtrlQ=17:' codes for PAUSE and RESUME
  101. GFFont=4:GFSize=9:GFFace=0:GFMode=1
  102. SerPort=-1:Baud=2400:Parity=0:StopBit=0:WordLen=1:BufLen=1029
  103. '
  104. Control$=STRING$(32,CHR$(0)):' set all control values to NULL
  105. MID$(Control$,7,1)=CHR$(7):'   allow the BELL sound
  106. MID$(Control$,8,1)=CHR$(8):'   allow a backspace value
  107. MID$(Control$,9,1)=CHR$(9):'  allow a TAB value
  108. MID$(Control$,10,1)=CHR$(10):' allow line feeds
  109. MID$(Control$,13,1)=CHR$(13):' allow carriage returns
  110. '
  111. ON ERROR GOSUB 65535:' enable disk error trapping
  112. '
  113. GOSUB "UART":' setup default uart stuff
  114. Cur$=" ":' default to graphic cursor
  115. TMode=5:' used for doing the backspace with the cursors
  116. ChrCnt=0:' used for counting characters for autolinefeed on column full.
  117. CntMax=80:Y=0:' columns per line on screen
  118. CapFlag=0:' turn off the text capture flag
  119. SendFlag=0:' text file sending flag off
  120. Wink=0:EnBlink=1:' current cursor state (0=off,1=on)
  121. Flag=1:' disable loading from finder
  122. DEF OPEN"CNFGBTRM"
  123. GOSUB "Read_Config":' read in the default settings first
  124. Flag=0:' always reset this so we bypass the reading routine
  125. GOTO"Queue"
  126. '
  127. '
  128. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  129. 'Functions
  130. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  131. '
  132. '                                  T/F - Color is >2 bits deep?
  133. '
  134. LONG FN CheckColor
  135.   LONG IF ColorQD
  136.     CkClrPtr& = PEEK LONG(PEEK LONG(&H0CC8))
  137.     Boolean   = PEEK LONG(CkClrPtr&+42)>129
  138.   XELSE
  139.     Boolean   = False
  140.   END IF
  141. END FN = Boolean
  142. '
  143. '                              Set the font and calc its height
  144. '
  145. LONG FN GetFht(GFFont,GFSize,GFFace,GFMode)
  146.   TEXT GFFont,GFSize,GFFace,GFMode
  147.   CALL GETFONTINFO(FAsc)
  148. END FN = FAsc+FDes+FLead
  149. '
  150. '                            Capture offset values from handles
  151. '
  152. DEF FN  GetWord(GWHndl&,GWOffSet)=PEEK WORD(PEEK LONG(GWHndl&)+GWOffSet)
  153. DEF FN GetLong&(GLHndl&,GLOffSet)=PEEK LONG(PEEK LONG(GLHndl&)+GLOffSet)
  154. '
  155. '
  156. '                            Place an integer on my event stack
  157. '
  158. LONG FN Push(PushVal)
  159.   IF SP+1>StakHi THEN SP=StakHi-1
  160.   SP = SP + 1
  161.   Stak(SP) = PushVal
  162. END FN
  163. '
  164. '                               Remove an integer from my stack
  165. '
  166. LONG FN Pop
  167.   LONG IF SP
  168.     PopVal = Stak(SP)
  169.     SP = SP - 1
  170.   XELSE
  171.     PopVal = 0
  172.   END IF
  173. END FN = PopVal
  174. '
  175. '                  Refresh a window without bringing it forward
  176. '
  177. LONG FN Format(Wnd2Format)
  178.   LONG IF Wnd2Format
  179.     OldOutPutWnd = WINDOW(1)
  180.     WINDOW OUTPUT Wnd2Format
  181.     GOSUB"Format Wnd"
  182.     IF OldOutPutWnd THEN WINDOW OUTPUT OldOutPutWnd
  183.   END IF
  184. END FN
  185. '
  186. '                                       Locate a button by name
  187. '
  188. LONG FN FindBtn&(BtnName$)
  189.   FndBtnHndl&=PEEK LONG(WINDOW(14)+140)
  190.   DO
  191.     CALL GETCTITLE(FndBtnHndl&,CtrlTitle$)
  192.     LONG IF BtnName$<>CtrlTitle$
  193.       FndBtnHndl&=PEEK LONG(PEEK LONG(FndBtnHndl&))
  194.     END IF
  195.   UNTIL BtnName$=CtrlTitle$ OR FndBtnHndl&=0
  196. END FN = FndBtnHndl&
  197. '
  198. '                                  Draw a frame around a button
  199. '
  200. LONG FN FrameBtn(BtnName$)
  201.   FrBtnHndl&=FN FindBtn&(BtnName$)
  202.   LONG IF FrBtnHndl&
  203.     BLOCKMOVE PEEK LONG(FrBtnHndl&)+8,VARPTR(Ft),8
  204.     CALL INSETRECT(Ft,-4,-4)
  205.     PEN 3,3,1,8,0
  206.     CALL FRAMEROUNDRECT(Ft,16,16)
  207.     CALL PENNORMAL
  208.   END IF
  209. END FN
  210. '
  211. '
  212. '                     Change cursor according to mouse position
  213. '
  214. LONG FN AutoCursor(Fy,Fx)
  215.   ACResult = Arrow
  216.   LONG IF WINDOW(0):                  ' if we have an active window
  217.     ACHndl& = TEHANDLE(WINDOW(0))
  218.     LONG IF ACHndl&
  219.       BLOCKMOVE PEEK LONG(ACHndl&),VARPTR(Ft),8
  220.       IF FN PTINRECT(Fy,Ft) THEN ACResult = IBeam
  221.      END IF
  222.     ACPort& = WINDOW(14)
  223.     LONG IF ACPort&
  224.       LONG IF FN FINDCONTROL(Fy,ACPort&,ACHndl&)
  225.         ACResult = Hand
  226.       END IF
  227.     END IF
  228.   LONG IF WINDOW(0)=SNDWIN OR WINDOW(0)=RECWIN:' works on send/rec window only
  229.    LONG IF FN PTINRECT(Fy,Mt)
  230.     IF CurStep=>4 THEN CurStep=0
  231.     ACResult=Ball+CurStep:CurStep=CurStep+1
  232.    XELSE
  233.     ACResult=Arrow:' else return to default cursor
  234.    END IF
  235.   END IF
  236.   END IF
  237. END FN = ACResult
  238. '
  239. '
  240. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  241. "Queue"
  242. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  243.  GOSUB"Initialize":'                    Execute set-up routines
  244.  FLUSHEVENTS:'                  Remove any events since startup
  245.  ON DIALOG GOSUB"Dialog"
  246.  ON MOUSE  GOSUB"Mouse"
  247.  ON MENU   GOSUB"Menu"
  248.  ON TIMER (1) GOSUB"Blink"
  249.  CURSOR Arrow:'                            Restore arrow cursor
  250. '
  251. '
  252. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  253. "Loop"
  254. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  255. '
  256.  DIALOG ON :MOUSE ON :MENU ON :TIMER ON
  257.  DIALOG OFF:MOUSE OFF:MENU OFF:TIMER OFF
  258. '
  259. LONG IF Abort=False AND WINDOW(0)=RECWIN
  260.  LONG IF LOF(SerPort):' check for chars in buffer
  261.   READ #SerPort,RX$;1:' read only if we received something
  262.   GOSUB "Xmodem_Receive":' go figure out where we are in routine
  263.  END IF
  264. END IF
  265. '
  266. LONG IF Abort=False AND WINDOW(0) = SNDWIN:' see if transmit active
  267.  ON Xmit_Step GOSUB "Wait_Start","Send_Data","Verify","Done","Wait_Ack"
  268. END IF
  269. '
  270. WHILE LOF(SerPort) AND WINDOW(0) = COMWIN
  271.  BuffCount=LOF(SerPort):' gets # of characters in the serial buffer
  272. SELECT Pause:' see if we are in a buffer overrun condition
  273.  CASE True:' if yes, then check to see if we have enough room now
  274.    IF BuffCount-1<50 THEN PRINT #SerPort,CHR$(CtrlQ):Pause=False
  275.  CASE False:' else see if we are close to full 
  276.   IF BuffCount>800 THEN PRINT #SerPort,CHR$(CtrlS);:Pause=True
  277. END SELECT
  278.   READ #SerPort,RX$;1:' read only if window active
  279.   GOSUB "RECV1"
  280. WEND
  281. '
  282. '
  283. '                                     Handle events on my stack
  284. '
  285. WHILE SP:'                     Is the stack pointer above zero?
  286.   MyEvent=FN Pop:'                 Pop the event from the stack
  287.   SELECT MyEvent:'                           React to the event
  288.     CASE OpenEvent:'                  Request to build a window
  289.       GOSUB"Build"
  290. '
  291.     CASE CloseEvent:'                 Request to close a window
  292.       Wnd2Close = FN Pop:'  Pop # of window to close from stack
  293. '                Bring it to the front for the capture routines
  294.       IF WINDOW(0)<>Wnd2Close THEN WINDOW Wnd2Close
  295.       GOSUB"Capture":'              Capture data before closing
  296. '
  297.       WINDOW CLOSE Wnd2Close:'                         Close it
  298. '
  299.     CASE BreakEvent:'                      Request to terminate
  300.       LONG IF WINDOW(0)
  301. '         Close open windows 1st to handle list/region disposal
  302.         FN Push(BreakEvent)
  303.         FN Push(WINDOW(0))
  304.         FN Push(CloseEvent)
  305.       XELSE
  306.         PleaseTerminate=True
  307.       END IF
  308. '
  309.   END SELECT:'                            End of event handlers
  310. '                          Cont while events remain on my stack
  311.   IF PleaseTerminate=True THEN "Break"
  312. WEND
  313. '
  314. LONG IF SendFlag=1:' see if sending a text file to remote
  315.  LONG IF NOT EOF(3):' loop til end of file
  316.  SELECT More
  317. '
  318.  CASE 1:' check for the end of file
  319.    LINE INPUT #3,Dsk$:More=0:DskLen=LEN(Dsk$):Cpos=1
  320.    IF DskLen=255 THEN Crflag=0 ELSE Crflag=1:' cr on full line
  321. '
  322.  CASE 0
  323.     PRINT #SerPort,MID$(Dsk$,Cpos,1);:' send to modem
  324.     Cpos=Cpos+1
  325.     LONG IF Cpos>DskLen
  326.      More=1
  327.      IF Crflag THEN PRINT #SerPort,Cr$;:' send cr on partial line
  328.     END IF
  329. '
  330.  END SELECT
  331.  XELSE
  332.   LONG IF More=0
  333.     PRINT #SerPort,MID$(Dsk$,Cpos,1);:' send to modem
  334.     Cpos=Cpos+1
  335.     LONG IF Cpos>DskLen
  336.      More=1
  337.      IF Crflag THEN PRINT #SerPort,Cr$;:' send cr on partial line
  338.     END IF
  339.   XELSE
  340.     ProHndl&=FN GETMHANDLE(130)
  341.     CALL SETITEM(ProHndl&,1,"Send Text...")
  342.     CLOSE #3:SendFlag=0
  343.   END IF
  344.  END IF
  345. END IF
  346. '
  347. '
  348. '                                 Set cursor by mouse position
  349. '
  350.  OldCsr=NewCsr:'                            Save the old cursor
  351.  NewCsr=Arrow:'                       Reset new cursor to arrow
  352.  CALL GETMOUSE(My):'                        Where is the mouse?
  353.  NewCsr=FN AutoCursor(My,Mx):'               Let the FN tell us
  354. '                                    If the cursor has changed…
  355.  IF NewCsr<>OldCsr THEN CURSOR NewCsr
  356. '
  357. GOTO"Loop"
  358. '
  359. '
  360. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  361. "Dialog"
  362. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  363.  Act=DIALOG(0):Ref=DIALOG(Act)
  364. '
  365.  LONG IF Act=CloseAct
  366.    LONG IF Ref=RECWIN:' see if transfer cancelled by user
  367.      GOSUB "Clear_Line":' send out cancel bytes first
  368.      Abort=True:' set flag so we bypass receive routine
  369.      FN Push(RECWIN):FN Push(CloseEvent):' close receive window
  370.       LONG IF RecBlock=1
  371.         RETURN
  372.       XELSE
  373.         CLOSE #1:KILL MacName$,Vol%:RETURN
  374.       END IF
  375.    END IF
  376.    LONG IF Ref=SNDWIN:' see if cancel wanted from SEND window
  377.     GOSUB"Clear_Line"
  378.     FN Push(SNDWIN):FN Push(CloseEvent):Abort=True
  379.     RETURN
  380.    END IF
  381.    LONG IF Ref=COMWIN:' see we they want to quit the application?
  382.     FN Push(BreakEvent):' if so then we insert a QUIT to shell as well
  383.    END IF
  384.     FN Push(Ref):FN Push(CloseEvent):' always close this window first
  385.    RETURN
  386.  END IF
  387. '
  388.  IF Act=RefreshAct THEN FN Format(Ref):RETURN
  389. '
  390.  IF Act=ClearAct THEN EDIT FIELD Ref,"":RETURN
  391. '
  392.  LONG IF Act=WindowAct
  393.    GOSUB"Capture"
  394.    WINDOW Ref
  395.    RETURN
  396.  END IF
  397. '
  398. LONG IF WINDOW(0) = COMWIN
  399. IF Ref=3 THEN Ref=13:' change the ENTER key to RETURN key
  400. IF Act=KeyAct THEN RX$=CHR$(Ref):CALL OBSCURECURSOR:' always turn it off
  401. SELECT
  402. CASE RX$=CHR$(8) AND Tbut(6)=2
  403.   RX$=CHR$(127)
  404.   PRINT #SerPort,RX$;
  405.   RX$=CHR$(8)
  406. CASE RX$=CHR$(8) AND Tbut(5)=2
  407.   PRINT #SerPort,RX$;
  408. CASE RX$<>CHR$(8)
  409.   PRINT #SerPort,RX$;
  410. END SELECT
  411. IF RX$=CHR$(13) AND Tbut(9)=1 THEN PRINT #SerPort,CHR$(10);
  412. IF Tbut(7)=1 THEN GOSUB "RECV"
  413. RETURN
  414. END IF
  415. '
  416.  LONG IF WINDOW(0) = TSWIN: ' Terminal Settings Window Dialogs
  417. LONG IF Act=ButtonAct
  418. SELECT Ref
  419. CASE 1
  420. GOSUB "FNT9"
  421. CASE 2
  422. GOSUB "FNT12"
  423. CASE 3
  424. GOSUB "BLK"
  425. CASE 4
  426. GOSUB "UL"
  427. CASE 5
  428. GOSUB "BCK"
  429. CASE 6
  430. GOSUB "DEL"
  431. CASE 7
  432. GOSUB "LOC"
  433. CASE 8
  434. GOSUB "REM"
  435. CASE 9
  436. GOSUB "LF"
  437. CASE 10
  438. GOSUB "Close Tset"
  439. CASE 11
  440. GOSUB "CanTset"
  441. CASE 12
  442. GOSUB "Toggle Blink"
  443. END SELECT
  444. RETURN
  445. END IF
  446.    RETURN
  447.  END IF
  448. '
  449.  LONG IF WINDOW(0) = CSWIN: ' Communications Settings Dialogs
  450. LONG IF Act=ButtonAct
  451. SELECT Ref
  452. CASE <=7
  453. GOSUB "Change Baud"
  454. CASE 8,9
  455. GOSUB "Change WordLength"
  456. CASE 10,11
  457. GOSUB "Change StopBits"
  458. CASE 12,13,14
  459. GOSUB "Change Parity"
  460. CASE 15,16
  461. GOSUB "Change Port"
  462. CASE 17
  463. GOSUB "Close Cset"
  464. CASE 18
  465. FOR T=1 TO 16:Cbut(T)=Hold(T):NEXT T:' Restore original values
  466. GOSUB "Close Cset"
  467. END SELECT
  468. END IF
  469.    RETURN
  470.  END IF
  471. '
  472.  LONG IF WINDOW(0) = SNDWIN
  473. 'nothing happens in this window, its all automatic for file xfer
  474.  END IF
  475. '
  476.  LONG IF WINDOW(0) = RECWIN
  477. 'nothing happens in this window, its all automatic for file xfer
  478.  END IF
  479. '
  480.  LONG IF WINDOW(0) = PROSET
  481.    LONG IF Act = ButtonAct
  482.    SELECT Ref
  483.     CASE 1,2,3,4:' change type and creator
  484.      GOSUB "Update Text"
  485.     CASE 5,6:'     change type of xmodem transfer
  486.      GOSUB "Update TransType"
  487.     CASE 7
  488.      GOSUB "Update MacBin"
  489.     CASE 8:' OK button used
  490.      GOSUB "Close TranSet"
  491.     CASE 9
  492.      GOSUB "CanTranSet":' cancel settings made
  493.    END SELECT
  494.   END IF
  495.    LONG IF Act=KeyAct
  496.     SELECT Ref
  497.      CASE 3
  498.      GOSUB "Close TranSet"
  499.     END SELECT
  500.   END IF
  501.  END IF
  502. '
  503.  LONG IF WINDOW(0) = ABTWIN
  504.    LONG IF Act = ButtonAct
  505.    SELECT Ref
  506.     CASE 1:' OK button used
  507.      GOSUB "Close About"
  508.    END SELECT
  509.   END IF
  510.    LONG IF Act=KeyAct
  511.     SELECT Ref
  512.      CASE 13,3
  513.      GOSUB "Close About"
  514.     END SELECT
  515.   END IF
  516.  END IF
  517. RETURN
  518. '
  519. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  520. "Mouse"
  521. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  522.  Mact=MOUSE(0):Mx=MOUSE(1):My=MOUSE(2)
  523. '
  524. RETURN
  525. '
  526. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  527. '                        Receive Subroutines
  528. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  529. "Xmodem_Receive"
  530. LONG IF Recv_Step=1
  531.  Recv_Step=2:' soon as we receive something go!
  532.  GOSUB"INIT_CRC":' set the crc/CheckSum calcs to 0 first
  533.  GOSUB"INIT_CHECKSUM":' initialize checksum routine
  534.  GOSUB"Show_Status":' show we are receiving data now...
  535. END IF
  536. '
  537. SELECT Recv_Step
  538.  CASE 2:' see if we are receiving the block
  539.   IF Count>2 THEN MID$(RECV$,Count-2,1)=RX$
  540.    LONG IF Count=0:' checks for the first character received
  541.     LONG IF RX$=CHR$(Eot)
  542.      PRINT #SerPort,CHR$(Ack):Recv_Step=8:BEEP:BEEP:CLOSE #1
  543.       LONG IF MacBin=True
  544.        GOSUB "GetFileInfo":' read in the file info on this file
  545.        GOSUB "SetFileInfo": ' update According TO The MacBinary DATA
  546.       END IF
  547.       LONG IF MacName$="UNTITLED"
  548.        NewName$=FILES$(0,"SAVE File as WHAT?","UNTITLED",Vol1%)
  549.         IF NewName$<>"" THEN RENAME MacName$ TO NewName$,Vol%
  550.       END IF
  551.      FN Push (RECWIN):FN Push(CloseEvent)
  552.     END IF
  553.     LONG IF RX$=CHR$(Can):' see if remote aborted
  554.      FN Push (RECWIN):FN Push(CloseEvent):CLOSE #1
  555.     END IF
  556.    END IF
  557.  END SELECT
  558. '
  559. C=ASC(RX$):' get the character value to work on the CRC/Checksum on
  560. '
  561. SELECT Count:' find out what character in the block we are at
  562.   CASE 0:' see if it starts with a START OF HEADER byte
  563.    RecSoh=C:' get the Start of Header we received
  564. '
  565.   CASE 1:' check the first byte against the BLOCK NUMBER
  566.    RecvBlock=C:' get the block number the remote is sending
  567. '
  568.   CASE 2:' last, check the compliment of the block number
  569.    Compliment=BlockCount XOR 255:' generates the compliment of the block number
  570.    RecvComp=C:' get the compliment of the block number
  571. '
  572.   CASE 131:' CRC LSB byte from remote (OR CHECKSUM VALUE)
  573.    ChkSum=C:' this is the checksum value we want to use
  574. '
  575. END SELECT
  576. '
  577. LONG IF Count>2 AND Count<131
  578.    GOSUB"Do_CheckSum":GOSUB "DO_CRC":' calculate based on data received
  579. XELSE
  580.    IF Count>2 GOSUB "DO_CRC":' always do a CRC even if we dont need it
  581. END IF
  582.  
  583.   Count=Count+1
  584. '
  585.  LONG IF Pbut(5)=1 AND Count=132:' if a 1 we are using CHECKSUM NOT CRC
  586.     IF CheckSum<>ChkSum THEN Retry=True:' if not correct then we got an error
  587.   Count=Count+1:'  then bump up counter so we use same remaining routines
  588.  END IF
  589.  
  590.   LONG IF Count=133:' see if we have got a full block count
  591. '
  592.  IF RecSoh<>Soh THEN Retry=True:' if they sent anything other than SOH, retry
  593. '
  594.   LONG IF RecvBlock>BlockCount:' if we are too far out, ABORT!
  595.      FN Push(RECWIN):FN Push(CloseEvent):' close receive window first
  596.      Abort=True:GOSUB "Clear_Line":' set flag and wait for pause in receiving
  597.       LONG IF RecBlock=1
  598.         RETURN
  599.       XELSE
  600.         CLOSE #1:KILL MacName$:RETURN
  601.       END IF
  602.   END IF
  603. '
  604.   LONG IF RecvBlock<BlockCount:' usually means a duplicate block, kick them up 1
  605.      PRINT #SerPort,CHR$(Ack);:' so we get the block we really want
  606.      RETURN
  607.   END IF
  608. '
  609.  IF RecvComp<>Compliment THEN Retry=True:' if check if block is wrong, flag
  610. '
  611.  LONG IF Pbut(5)=2:' looking for CRC check digits
  612.   IF CRCHI OR CRCLO <>0 THEN Retry=True:' Will equal a LOGICAL 0 if CRC correct
  613.  END IF
  614. '
  615.     SELECT Retry
  616.       CASE True
  617.        XResult=Nak
  618.       CASE False
  619.        XResult=Ack
  620.      END SELECT
  621. '
  622.    LONG IF Retry=False:' if false, then we got a good block
  623.     LONG IF RecBlock=1:' do an automatic check for MacBinary II protocol
  624.      LONG IF ASC(MID$(RECV$,1,1))=0 AND ASC(MID$(RECV$,75,1))=0
  625.       GOSUB "INIT_CRC":' start by setting CRC to 0
  626.       FOR ChkChr=1 TO 124:' characters to check for CRC calcs
  627.       C=ASC(MID$(RECV$,ChkChr,1)):GOSUB "DO_CRC":' read byte, calculate
  628.       NEXT ChkChr:GOSUB "FIND_CRC":' calculate total CRC done in
  629.       MSBCRC=ASC(MID$(RECV$,125,1)):LSBCRC=ASC(MID$(RECV$,126,1))
  630.        IF LSBCRC<>CRCLO AND MSBCRC<>CRCHI THEN MacBin=False ELSE MacBin=True
  631.        LONG IF MacBin=False:' see if its the older MacBinary I protocol
  632.         IF ASC(MID$(RECV$,83,1))=0 THEN MacBin=True:' checks older protocol
  633.        END IF
  634.      END IF
  635.      LONG IF MacBin=True
  636.        GOSUB "Extract_Filename":' get out filename and show
  637.        GOSUB "Extract_FileInfo":' retrieve the creator/type and show it
  638.        GOSUB "Extract_Size":'     get the DATA and RESOURCE sizes
  639.        GOSUB "Extract_FindrAtt":' get out the FINDER attribute flags
  640.        Protocol$="MacBinary II":GOSUB "Show_Protocol":GOSUB"Show_Graph"
  641.        GOSUB "Open_File":' go setup file for writing to
  642.       XELSE
  643.        GOSUB "Untitled_Filename":'untitled name and also
  644.        GOSUB "Show_Name":' show the name we are defaulting to
  645.        Protocol$="Unknown":GOSUB "Show_Protocol"
  646.        HasData=True:HasRes=False:GOSUB "Open_File":' open as a DATA file only
  647.      END IF
  648.     END IF
  649. '
  650.      LONG IF MacBin=True AND RecBlock<>1
  651.       LONG IF Complete=False
  652.        TotalBytes&=TotalBytes&+128:Temp$=STR$(TotalBytes&)
  653.        RecvBytes&=RecvBytes&+128:' amount we have got thus far
  654.        GOSUB "Update_Size":' show bytes received in window
  655.        GOSUB "Move_Graph":' updates the slider in window
  656.        Block$=MID$(RECV$,1,128):BPtr&=VARPTR(Block$)+1:' point to data
  657.         LONG IF RecvBytes&<WriteSize&
  658.          BlkLen&=128
  659.         XELSE
  660.          BlkLen&=128-(RecvBytes&-WriteSize&):' get residual block size
  661.          Complete=True
  662.         END IF
  663.          LONG IF BlkLen&<>0:' check to see if on a 128 byte boundry
  664.            WRITE FILE #1,BPtr&,BlkLen&:' write 128 bytes of data
  665.          XELSE
  666.            Complete=True:' else we ended on a 128 byte border
  667.          END IF
  668.       END IF
  669.        IF Complete=True THEN GOSUB "Check_Resource":' see if using resource fork
  670.      XELSE
  671.       LONG IF MacBin=False
  672.        TotalBytes&=TotalBytes&+128:Temp$=STR$(TotalBytes&)
  673.        GOSUB "Update_Size":' show bytes received in window
  674.        Block$=MID$(RECV$,1,128):BlkLen&=128:BPtr&=VARPTR(Block$)+1:' point to data
  675.        WRITE FILE #1,BPtr&,BlkLen&
  676.       END IF
  677.      END IF
  678. '
  679.       RecBlock=RecBlock+1:' increment for the next block# received
  680.       BlockCount=BlockCount+1:' then add to our counter for block numbers
  681. '
  682.     IF BlockCount=256 THEN BlockCount=0
  683.      PRINT #SerPort,CHR$(XResult);:' send out either good or bad indicator
  684. '
  685.    XELSE
  686.     Recv_Error=Recv_Error+1:GOSUB "Show_Error":' displays the error count
  687.      LONG IF Recv_Error=10
  688.       GOSUB "Clear_Line":' send out the cancel bytes first
  689.       FN Push (RECWIN):FN Push(CloseEvent)
  690.      LONG IF RecBlock>1:' see if still trying for the first block
  691.       CLOSE #1:KILL MacName$,Vol%
  692.      END IF
  693.      END IF
  694. '
  695.    END IF
  696.     Count=0:Retry=False:GOSUB"INIT_CRC":GOSUB "INIT_CHECKSUM"
  697.   END IF
  698. '
  699. RETURN
  700. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  701. '                 Xmodem Send Subroutines
  702. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  703. "Wait_Start"
  704.    LONG IF LOF(SerPort):' wait for a value from the port
  705.     READ #SerPort,RX$;1:' read only if we got something
  706. '
  707.       LONG IF RX$="C"
  708.        GOSUB "Check_MacBinary":' see if sending a Macbinary file 
  709.        CRC=True:Xmit_Step=2:' they want CRC, so continue
  710.        GOSUB "Show_Send":' show we are sending now
  711.        RETURN
  712.       END IF
  713. '
  714.       LONG IF RX$=CHR$(Nak)
  715.        GOSUB "Check_MacBinary":' see iuf we have to open the file or what
  716.        SUM=True:Xmit_Step=2:' else then want checksum
  717.        GOSUB "Show_Send":' show we are sending now
  718.        RETURN
  719.       END IF
  720. '
  721.      IF RX$=CHR$(Can) THEN GOSUB "Cancel_Send":RETURN
  722.    END IF
  723. RETURN
  724. '--------------------------------------------------------------
  725. "Send_Data"
  726. Retry=False:' set this flag so we don't repeat routine if error
  727. GOSUB "Send_Header":' send out SOH, block#, compliment Block#
  728. GOSUB "Send_Block":' send out the 128 byte block of data
  729. GOSUB "Send_Check":' send out either CRC or Checksum value
  730. Xmit_Step=3:' advance to next step and wait for reply
  731. RETURN
  732. '--------------------------------------------------------------
  733. "Send_Header"
  734. Time_Out=0:' reset waiting time for reply from remote first
  735.  PRINT #SerPort,CHR$(Soh);:' send out start of header
  736.  PRINT #SerPort,CHR$(XmitBlock);:' send out block number this time
  737.  Compliment=XmitBlock XOR 255:' generates the compliment of the block number
  738.  PRINT #SerPort,CHR$(Compliment);:' send out compliment of block#
  739. RETURN
  740. '--------------------------------------------------------------
  741. "Send_Block"
  742. GOSUB "INIT_CRC":GOSUB "INIT_CHECKSUM":' set check bytes to 0
  743.  FOR ChkChr=1 TO 128:' characters to check for CRC calcs
  744.   C=ASC(MID$(RECV$,ChkChr,1))
  745.   PRINT #SerPort,CHR$(C);:' data byte out the port
  746.   GOSUB "Do_CheckSum":' go calculate the checksum
  747.   GOSUB "DO_CRC":' read byte, calculate
  748.  NEXT ChkChr
  749. RETURN
  750. '--------------------------------------------------------------
  751. "Send_Check"
  752.  GOSUB "FIND_CRC":' calculate total CRC
  753. '
  754.  LONG IF CRC=True:' if they wanted CRC send them that
  755.   PRINT #SerPort,CHR$(CRCHI);:' MSBCRC
  756.   PRINT #SerPort,CHR$(CRCLO);:' LSBCRC
  757.  XELSE
  758.   PRINT #SerPort,CHR$(CheckSum);:' else send them the checksum value
  759.  END IF
  760. RETURN
  761. '--------------------------------------------------------------
  762. "Verify"
  763.    LONG IF LOF(SerPort):' wait for a value from the port
  764.     READ #SerPort,RX$;1:' read only if we got something
  765. '
  766.     LONG IF RX$=CHR$(Ack)
  767.       LONG IF MacBin=True AND BlockCount>1:' if true, then do calcs
  768.        TotalBytes&=TotalBytes&+128:Temp$=STR$(TotalBytes&)
  769.        XmitBytes&=XmitBytes&+128:' add 128 to the total we have sent
  770.        GOSUB "Update_Size":' update amount sent on screen
  771.        GOSUB "Move_Graph":' and move the graph on screen too!
  772.       END IF
  773. '
  774.       LONG IF MacBin=False:' else see if we are sending TEXT file
  775.        TotalBytes&=TotalBytes&+128:Temp$=STR$(TotalBytes&)
  776.        XmitBytes&=XmitBytes&+128:' add 128 to the total we have sent
  777.        GOSUB "Update_Size":' update amount sent on screen
  778.        GOSUB "Move_Graph":' and move the graph on screen too!
  779.       END IF
  780. '
  781.       Xmit_Step=2:' set to send the next block
  782.       GOSUB "Read_Block":' go read in next block to send
  783.       XmitBlock=(XmitBlock+1)AND 255:' allows it to be 8 bit counter
  784.       BlockCount=BlockCount+1:' increment the total block counter
  785.       RETURN
  786.      END IF
  787. '
  788.     LONG IF RX$=CHR$(Nak) OR RX$="C"
  789.      Retry=True:Xmit_Step=2:' else resend same block
  790.      Recv_Error=Recv_Error+1:GOSUB "Show_Error":' displays the error count
  791.       LONG IF Recv_Error=10
  792.        FN Push (SNDWIN):FN Push(CloseEvent)
  793.        Abort=True
  794.       END IF
  795.      RETURN
  796.     END IF
  797. '
  798.      IF RX$=CHR$(Can) THEN GOSUB "Cancel_Send":RETURN
  799.    END IF
  800. RETURN
  801. '--------------------------------------------------------------
  802. "Done"
  803.    LONG IF LOF(SerPort):' wait for data coming in
  804.     READ #SerPort,RX$;1:' read only if we got something
  805.      LONG IF RX$=CHR$(Ack)
  806.       PRINT #SerPort,CHR$(Eot);:' send back again
  807.       Xmit_Step=5:' move the last subroutine
  808.      END IF
  809.    END IF
  810. RETURN
  811. '--------------------------------------------------------------
  812. "Wait_Ack"
  813.  LONG IF LOF(SerPort):' wait til data shows up
  814.   READ #SerPort,RX$;1:' read in the ACK (we just lose it)
  815.   FN Push (SNDWIN):FN Push(CloseEvent)
  816.   BEEP:BEEP:' we are done!
  817.  END IF
  818. RETURN
  819. '--------------------------------------------------------------
  820. "Check_MacBinary"
  821. LONG IF MacBin=True:' if Macbinary wanted don't load blocks
  822.   Protocol$="MacBinary II":' show we are sending a Macbinary file
  823.   GOSUB "Open_SendFile":' open the file we are going to send DONT READ DATA!
  824. XELSE:' else we want to read in some data
  825.   GOSUB "Open_SendFile":' open the file, get the size to write to remote
  826.   GOSUB "Read_Block":' go read block, pad if needed
  827.   Protocol$="TEXT"
  828. END IF
  829. GOSUB "Show_Protocol":' show type of file we are sending TEXT or MACBINARY
  830. GOSUB "Show_Graph":' and draw the percent scale on the dialog box
  831. RETURN
  832. '--------------------------------------------------------------
  833. "Cancel_Send"
  834.      Abort=True:CLOSE #1
  835.      FN Push (SNDWIN):FN Push(CloseEvent)
  836. RETURN
  837. '--------------------------------------------------------------
  838. "Read_Block"
  839. BPtr&=VARPTR(RECV$)+1:' point to start of block data
  840. '
  841. LONG IF XmitBytes&+128 > WriteSize&:' check for small amount left
  842.  BlkLen&=WriteSize&-XmitBytes&:' gets the amount left to send this time
  843.  RECV$=STRING$(128,CHR$(65)):' pad whole block first
  844.  XmitBytes&=WriteSize&:' set for full size sent
  845. XELSE
  846.  BlkLen&=128
  847. END IF
  848. '
  849. LONG IF BlkLen&>0
  850.   READ FILE #1,BPtr&,BlkLen&:' read in remainder of bytes from file
  851. XELSE
  852.   CLOSE #1:' close the file since this portion is done
  853.    LONG IF SecPass=False AND HasRes=True:' see if we completed data, need RES
  854.     OPEN "IR",1,MacName$,,Vol%: ' write only to the resource fork of the file
  855.     WriteSize&=ResFork&:' used for writing same size to disk
  856.     XmitBytes&=0:' set to zero for total sent out
  857.     SecPass=True:' so we don't reopen the resource file again
  858.     GOTO "Read_Block":' and repeat to start the next routine
  859.    XELSE
  860.     PRINT #SerPort,CHR$(Eot);:' if ended on 128 byte boundry, send out eot
  861.     Xmit_Step=4:' signal to routine we are done
  862.    END IF
  863. END IF
  864. RETURN
  865. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  866. '                  CRC and Checksum Subroutines
  867. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  868. "INIT_CRC"
  869. CRCHI=0:CRCLO=0:' set initial CRC value to nothing (zero)
  870. RETURN
  871. '--------------------------------------------------------------
  872. "INIT_CHECKSUM"
  873. CheckSum=0:' set to zero in case user wants to use checksum
  874. RETURN
  875. '--------------------------------------------------------------
  876. "DO_CRC":' value to use is in variable C (a number)
  877. H=CRCHI:L=CRCLO:' get old CRC value
  878.  FOR B=1 TO 8:' bit to shift positions for calculations
  879.   C=C<<1:' not pretty but we need to rotate the bits to find crc
  880.     LONG IF C>255
  881.      C=C AND 255:'we have a carry so rotate both H & L now
  882.      L=(L<<1)+1:' rotate in the carry from C
  883.         LONG IF L>255:' if L generated a carry, we also add 1 to H for rotate
  884.          L=L AND 255:' get back to limited value (minus 1 for rotate)
  885.          H=(H<<1)+1
  886.            LONG IF H>255
  887.             H=(H AND 255) XOR 16:L=L XOR 33
  888.            END IF
  889.         XELSE
  890.          H=H<<1:' else we just rotate the HIGH byte
  891.            LONG IF H>255
  892.             H=(H AND 255) XOR 16:L=L XOR 33
  893.            END IF
  894.         END IF
  895.    XELSE
  896.     L=L<<1:' else we do a rotate without the carry from C
  897.        LONG IF L>255:' if L generated a carry, we also add 1 to H for rotate
  898.         L=L AND 255:' get back to limited value
  899.         H=(H<<1)+1
  900.            LONG IF H>255
  901.             H=(H AND 255) XOR 16:L=L XOR 33
  902.            END IF
  903.        XELSE
  904.         H=H<<1
  905.            LONG IF H>255
  906.             H=(H AND 255) XOR 16:L=L XOR 33
  907.            END IF
  908.        END IF
  909.    END IF
  910.  NEXT B:CRCHI=H:CRCLO=L:RETURN
  911. '--------------------------------------------------------------
  912. "FIND_CRC":' does the last two bytes where the CRC actually goes
  913. C=0:GOSUB "DO_CRC":C=0:GOSUB "DO_CRC":RETURN
  914. '--------------------------------------------------------------
  915. "Do_CheckSum"
  916. CheckSum=CheckSum+C:' adds the value of the character received to what we got
  917. IF CheckSum>255 THEN CheckSum=CheckSum AND 255:' turns it into an 8 bit counter
  918. RETURN
  919. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  920. '               MacBinary II Decoding Subroutines
  921. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  922. "Extract_Filename"
  923.  NameLen=ASC(MID$(RECV$,2,1)):' gets the length counter for the filename
  924. MacName$=MID$(RECV$,3,NameLen):GOSUB"Show_Name":RETURN
  925. '--------------------------------------------------------------
  926. "Untitled_Filename"
  927.   FileType$="TEXT":MacName$="UNTITLED"
  928.      SELECT
  929.       CASE Pbut(1)=2
  930.        DEF OPEN="TEXTMSWD"
  931.        FileCreator$="MSWD"
  932.       CASE Pbut(2)=2
  933.        FileCreator$="MACA"
  934.        DEF OPEN="TEXTMACA"
  935.       CASE Pbut(3)=2
  936.        FileCreator$="nX^n"
  937.        DEF OPEN="TEXTnX^n"
  938.       CASE Pbut(4)=2
  939.        FileCreator$="????"
  940.        DEF OPEN="TEXT????"
  941.      END SELECT
  942.   GOSUB "Show_CreatorType":' show what we are getting on screen
  943. RETURN
  944. '--------------------------------------------------------------
  945. "Extract_FileInfo"
  946.  FileType$=MID$(RECV$,66,4):FileCreator$=MID$(RECV$,70,4)
  947. TempF$=FileType$+FileCreator$
  948.  DEF OPEN=TempF$
  949.  GOSUB"Show_CreatorType":RETURN
  950. '--------------------------------------------------------------
  951. "Extract_Size"
  952. DataSize$=MID$(RECV$,84,4):ResSize$=MID$(RECV$,88,4)
  953. DEFSTR LONG
  954.  DataFork&=CVI(DataSize$):ResFork&=CVI(ResSize$)
  955. DEFSTR WORD
  956. IF DataFork&<>0 THEN HasData=True ELSE HasData=False:' set flags
  957. IF ResFork&<>0 THEN HasRes=True ELSE HasRes=False:' for both forks
  958. TotalSize&=(((DataFork&+ResFork&)\128)+.5)*128
  959. RETURN
  960. '--------------------------------------------------------------
  961. "Extract_FindrAtt"
  962. FindrFlags%=ASC(MID$(RECV$,74,1)):' this is the FINDER attribute flags
  963. FindrFlags%=FindrFlags% << 8:' shift over to the HIGH byte in word
  964. 'bits 0 thru 7 are obtained (high order byte wanted)
  965. RETURN
  966. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  967. '               MacBinary II Encoding Subroutine
  968. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  969. "Encode_MacBinary"
  970. RECV$=STRING$(128,CHR$(0)):' zero out the whole first block in case
  971. '
  972. MID$(RECV$,2,1)=CHR$(LEN(MacName$)):' put in the filename length
  973. MID$(RECV$,3,LEN(MacName$))=MacName$:' then stuff in the filename
  974. '
  975. DEFSTR LONG
  976.  DataSize$=MKI$(DataFork&):ResSize$=MKI$(ResFork&)
  977. DEFSTR WORD
  978. MID$(RECV$,84,4)=DataSize$:MID$(RECV$,88,4)=ResSize$:' puts in lengths
  979. '
  980. GOSUB "GetFileInfo":' go get the file information
  981.   DEFSTR LONG
  982.  Ctype&=PEEK LONG(Hparmblkptr&+36)
  983.  FileCreator$=MKI$(Ctype&)
  984.  Ftype&=PEEK LONG(Hparmblkptr&+32)
  985.  FileType$=MKI$(Ftype&)
  986.   DEFSTR WORD
  987. '
  988. MID$(RECV$,66,4)=FileType$:' insert the file type string
  989. MID$(RECV$,70,4)=FileCreator$:' insert the file creator
  990. '
  991. OldFlags%=OldFlags%>>8:' shift the HIGH order bits down to low ones
  992. MID$(RECV$,74,1)=CHR$(OldFlags%):' insert the finder info
  993. '
  994. MID$(RECV$,123,1)=CHR$(129):MID$(RECV$,124,1)=CHR$(129):' shows MacBinary II
  995. '
  996. LONG IF Pbut(7)=2:' check to see if MacBinary II in effect
  997.  MacBin=True:' if yes, then set flag true
  998.  Protocol$="MacBinary II"
  999.   FOR ChkChr=1 TO 124:' characters to check for CRC calcs
  1000.   C=ASC(MID$(RECV$,ChkChr,1)):GOSUB "DO_CRC":' read byte, calculate
  1001.   NEXT ChkChr:GOSUB "FIND_CRC":' calculate total CRC done in
  1002.   MID$(RECV$,125,1)=CHR$(MSBCRC):' stuff in the CRC values for Macbinary II
  1003.   MID$(RECV$,126,1)=CHR$(LSBCRC):' protocol detection (if wanted)
  1004. XELSE
  1005.  MacBin=False:' else its not true, just a who knows type file
  1006.  Protocol$="Who Knows..."
  1007. END IF
  1008. RETURN
  1009. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1010. '                  Send Xmodem File Subroutine
  1011. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1012. "Open_SendFile"
  1013. LONG IF HasData=True AND HasRes=False
  1014.   OPEN "ID",1,MacName$,,Vol%:' set up file for writing to
  1015.   WriteSize&=DataFork&:' used for writing same size to disk
  1016.   RETURN
  1017. END IF
  1018. LONG IF HasData=False AND HasRes=True
  1019.   OPEN "IR",1,MacName$,,Vol%: ' write only to the resource fork of the file
  1020.   WriteSize&=ResFork&:' used for writing same size to disk
  1021.   SecPass=True:' so we don't reopen the resource file again
  1022.   RETURN
  1023. END IF
  1024. LONG IF HasData=True AND HasRes=True
  1025.   OPEN"ID",1,MacName$,,Vol%:' just write to a data file first
  1026.   WriteSize&=DataFork&:' used for writing same size to disk
  1027. END IF
  1028.  RETURN
  1029. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1030. '                  Receive Xmodem File Subroutines
  1031. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1032. "Open_File"
  1033. GOSUB "GetVolNum":' gets the volume number in Vol%
  1034. LONG IF HasData=True AND HasRes=False
  1035.   OPEN "OD",1,MacName$,,Vol%:' set up file for writing to
  1036.   WriteSize&=DataFork&:' used for writing same size to disk
  1037.   RETURN
  1038. END IF
  1039. LONG IF HasData=False AND HasRes=True
  1040.   OPEN "OR",1,MacName$,,Vol%: ' write only to the resource fork of the file
  1041.   WriteSize&=ResFork&:' used for writing same size to disk
  1042.   SecPass=True:' so we don't reopen the resource file again
  1043.   RETURN
  1044. END IF
  1045. LONG IF HasData=True AND HasRes=True
  1046.   OPEN"OD",1,MacName$,,Vol%:' just write to a data file first
  1047.   WriteSize&=DataFork&:' used for writing same size to disk
  1048. END IF
  1049.  RETURN
  1050. '--------------------------------------------------------------
  1051. "Check_Resource"
  1052. LONG IF SecPass=False:' see if first time through
  1053.  LONG IF HasRes=True
  1054.   CLOSE #1:' close off the file first
  1055.   OPEN "OR",1,MacName$,,Vol%: ' write only to the resource fork of the file
  1056.   WriteSize&=ResFork&:' used for writing same size to disk
  1057.   RecvBytes&=0:' set to zero for amount received for new fork
  1058.   Complete=False:' then start routine again
  1059.   SecPass=True:' only allowed this routine once
  1060.  END IF
  1061. END IF
  1062. RETURN
  1063. '--------------------------------------------------------------
  1064. "GetVolNum"
  1065. X = FN GETVOL(VARPTR(PBlock$)):' gets the data into a string first
  1066. Vol%=PEEK WORD(VARPTR(PBlock$)+22):' extracts the current volume ref number
  1067. RETURN
  1068. '--------------------------------------------------------------
  1069. "Rename_File":' this is only used for ymodem type transfers
  1070.    TEXT 0,12,,0:' set to Chicago 12
  1071.    T = 25:L = 13:B = 41:R = 145
  1072.    Temp$ = "Will rename file to :"
  1073.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1074.    L = 148:R = 424
  1075.    Temp$ = "new filename goes here"
  1076. RETURN
  1077. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1078. '              Graphic Percentage Subroutine
  1079. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1080. "Move_Graph"
  1081.  CALL GETPENSTATE(PenSpecs$):'     Record the current pen state
  1082. T=211:L=26:B=236:R=415:' rect that we get to paint in
  1083. PEN ,1,1,8,3:' set for a grey scale drawing
  1084. SizePercent!=((TotalBytes&*100)\TotalSize&)
  1085. R=(((390*SizePercent!)-.5)\100)+L:IF R>415 THEN R=415
  1086. CALL PAINTRECT(T)
  1087. CALL SETPENSTATE(PenSpecs$):'     Restore the current pen state
  1088. RETURN
  1089. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1090. '          Send/Receive Dialog Info Display Subroutines
  1091. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1092. "Show_Name"
  1093.    TEXT 0,12,,0:' set to Chicago 12
  1094.    T=8:L = 148:B=24:R = 381
  1095.    Temp$ = MacName$
  1096.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1097.    RETURN
  1098. '--------------------------------------------------------------
  1099. "Show_Protocol"
  1100.    TEXT 0,12,,0:' set to Chicago 12
  1101.    T=64:L = 149:B=80:R = 264
  1102.    Temp$ = Protocol$
  1103.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1104.    RETURN
  1105. '--------------------------------------------------------------
  1106. "Show_CreatorType"
  1107.    TEXT 0,12,,0:' set to Chicago 12
  1108.    T=151:L = 149:B=167:R = 195
  1109.    Temp$ = FileCreator$
  1110.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1111.    T = 131:L = 150:B = 147:R = 195
  1112.    Temp$ = FileType$
  1113.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1114.    RETURN
  1115. '--------------------------------------------------------------
  1116. "Show_Error"
  1117.    TEXT 0,12,,0:' set font to Chicago first
  1118.    T=84:L = 149:B=100:R = 183
  1119.    Temp$ = STR$(Recv_Error)
  1120.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1121.  RETURN
  1122. '--------------------------------------------------------------
  1123. "Update_Size"
  1124. 'Shows the number of bytes received thus far
  1125.    TEXT 0,12,,0:' set to Chicago 12
  1126.    T=44:L=147:B=60:R=319
  1127.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0):RETURN
  1128. '--------------------------------------------------------------
  1129. "Show_Status"
  1130.    Temp$ = "Receiving Data":GOSUB "Show_Msg":RETURN
  1131. '--------------------------------------------------------------
  1132. "Show_Send"
  1133.    Temp$="Sending Data"
  1134. "Show_Msg"
  1135.    TEXT 0,12,,0:' set to Chicago 12
  1136.    T = 111:L = 150:B = 127:R = 282
  1137.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1138. RETURN
  1139. '--------------------------------------------------------------
  1140. "Show_Graph"
  1141.  CALL GETPENSTATE(PenSpecs$):'     Record the current pen state
  1142.    T = 210:L = 25:B = 237:R = 416
  1143.    PEN ,1,1,8,19
  1144.    CALL PAINTRECT(T)
  1145.    PEN ,,1,8,0
  1146.    CALL FRAMERECT(T)
  1147.    T = 187:L = 153:B = 203:R = 309
  1148.    Temp$ = "Progress Indicator %"
  1149.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1150.    TEXT 4,9,,0
  1151.    T=240:L = 23:B=251:R = 32
  1152.    Temp$ = "0"
  1153.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1154.    L=58:R=72
  1155.    Temp$ = "10"
  1156.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1157.    L = 97:R = 109
  1158.    Temp$ = "20"
  1159.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1160.    L = 136:R = 150
  1161.    Temp$ = "30"
  1162.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1163.    L = 174:R = 189
  1164.    Temp$ = "40"
  1165.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1166.    L = 214:R = 228
  1167.    Temp$ = "50"
  1168.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1169.    L = 253:R = 268
  1170.    Temp$ = "60"
  1171.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1172.    L = 292:R = 308
  1173.    Temp$ = "70"
  1174.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1175.    L = 332:R = 345
  1176.    Temp$ = "80"
  1177.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1178.    L = 370:R = 386
  1179.    Temp$ = "90"
  1180.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1181.    L = 407:R = 427
  1182.    Temp$ = "100"
  1183.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1184.  CALL SETPENSTATE(PenSpecs$):'     Restore the current pen state
  1185. RETURN
  1186. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1187. '                        Receive Abort Subroutine
  1188. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1189. "Clear_Line":' loop til sender stops first
  1190.  IF LOF(SerPort) THEN READ #SerPort,RX$;1:GOTO "Clear_Line"
  1191.  FOR T=1 TO 5:PRINT #SerPort,CHR$(Can);:NEXT T:' send out the cancel bytes
  1192.  RETURN
  1193. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1194. '               Receive Initial Start Subroutine
  1195. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1196. '--------------------------------------------------------------
  1197. "Check_Receive"
  1198.  SELECT Recv_Step
  1199.   CASE 1
  1200.    LONG IF Pbut(5)=2:' see if CRC wanted
  1201.     PRINT #SerPort,"C";:' send out a C to start this mess
  1202.    XELSE
  1203.     PRINT #SerPort,CHR$(Nak):' else we want checksum
  1204.    END IF
  1205.    Time_Out=Time_Out+1
  1206.    LONG IF Time_Out=60
  1207.     GOSUB "Clear_Line":' send out cancel bytes too
  1208.     FN Push (RECWIN):FN Push(CloseEvent)
  1209.     BEEP:BEEP:' let them know we timed out
  1210.    END IF
  1211.  END SELECT
  1212. RETURN
  1213. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1214. '                  Options Menu Dialog Subroutines
  1215. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1216. "Update Text"
  1217. FOR T=1 TO 4:IF Pbut(T)=1 THEN NEXT T
  1218. Pbut(T)=1:BUTTON T,Pbut(T)
  1219. Pbut(Ref)=2:BUTTON Ref,Pbut(Ref)
  1220. RETURN
  1221. '--------------------------------------------------------------
  1222. "Update TransType"
  1223. LONG IF Ref=5
  1224. Pbut(5)=2:Pbut(6)=1
  1225. XELSE
  1226. Pbut(5)=1:Pbut(6)=2
  1227. END IF
  1228. BUTTON 5, Pbut(5)
  1229. BUTTON 6, Pbut(6)
  1230. RETURN
  1231. '--------------------------------------------------------------
  1232. "Update MacBin"
  1233. IF Pbut(7)=2 THEN Pbut(7)=1 ELSE Pbut(7)=2
  1234. BUTTON 7, Pbut(7)
  1235. RETURN
  1236. '--------------------------------------------------------------
  1237. "Close TranSet"
  1238.  FN Push(PROSET)
  1239.  FN Push(CloseEvent)
  1240. RETURN
  1241. '---------------------------------------------------------------
  1242. "CanTranSet"
  1243. FOR T=1 TO 7:Pbut(T)=Hold(T):NEXT T:' Return all values to originals
  1244. GOSUB "Close TranSet":RETURN
  1245. '--------------------------------------------------------------
  1246. "FNT9"
  1247. Tbut(1)=2:Tbut(2)=1:GFSize=9:GOSUB "Update Font":RETURN
  1248. "FNT12"
  1249. Tbut(1)=1:Tbut(2)=2:GFSize=12:GOSUB "Update Font":RETURN
  1250. "BLK"
  1251. Tbut(3)=2:Tbut(4)=1:Cur$=" ":TMode=5:GOSUB "Update Cursor":RETURN
  1252. "UL"
  1253. Tbut(3)=1:Tbut(4)=2:Cur$="_":TMode=1:GOSUB "Update Cursor":RETURN
  1254. "BCK"
  1255. Tbut(5)=2:Tbut(6)=1:GOSUB "Update Key":RETURN
  1256. "DEL"
  1257. Tbut(5)=1:Tbut(6)=2:GOSUB "Update Key":RETURN
  1258. "LOC"
  1259. Tbut(7)=Tbut(7) XOR 1:GOSUB "Update Loc":RETURN
  1260. "REM"
  1261. Tbut(8)=Tbut(8) XOR 1:GOSUB "Update Rem":RETURN
  1262. "LF"
  1263. Tbut(9)=Tbut(9) XOR 1:GOSUB "Update LF":RETURN
  1264. '---------------------------------------------------------------
  1265. "Update Font"
  1266.      BUTTON 1, Tbut(1)
  1267.      BUTTON 2, Tbut(2)
  1268. RETURN
  1269. '---------------------------------------------------------------
  1270. "Update Cursor"
  1271.      BUTTON 3, Tbut(3)
  1272.      BUTTON 4, Tbut(4)
  1273. RETURN
  1274. '---------------------------------------------------------------
  1275. "Update Key"
  1276.      BUTTON 5, Tbut(5)
  1277.      BUTTON 6, Tbut(6)
  1278. RETURN
  1279. '---------------------------------------------------------------
  1280. "Update Loc"
  1281.      BUTTON 7, Tbut(7)+1
  1282. RETURN
  1283. '---------------------------------------------------------------
  1284. "Update Rem"
  1285.      BUTTON 8, Tbut(8)+1
  1286. RETURN
  1287. '---------------------------------------------------------------
  1288. "Update LF"
  1289.      BUTTON 9, Tbut(9)+1
  1290. RETURN
  1291. '---------------------------------------------------------------
  1292. "Close Tset"
  1293.  FN Push(TSWIN)
  1294.  FN Push(CloseEvent)
  1295. RETURN
  1296. '---------------------------------------------------------------
  1297. "CanTset"
  1298. FOR T=1 TO 10:Tbut(T)=Hold(T):NEXT T:' Return all values to originals
  1299. GOSUB "Close Tset":RETURN
  1300. '---------------------------------------------------------------
  1301. "Toggle Blink"
  1302. LONG IF Tbut(10)=2
  1303. Tbut(10)=1:EnBlink=0
  1304. XELSE
  1305. Tbut(10)=2:EnBlink=1
  1306. END IF
  1307. BUTTON 12, Tbut(10)
  1308. RETURN
  1309. '---------------------------------------------------------------
  1310. "Change Baud"
  1311. FOR OldBaud=1 TO 7:IF Cbut(OldBaud)<>2 THEN NEXT OldBaud:RETURN:' Has to be found
  1312. Cbut(OldBaud)=1
  1313. ON OldBaud GOSUB "C1","C2","C3","C4","C5","C6","C7" 
  1314. Cbut(Ref)=2:ON Ref  GOSUB "C1","C2","C3","C4","C5","C6","C7"
  1315. GOSUB "UART"
  1316. RETURN
  1317. '---------------------------------------------------------------
  1318. "Change WordLength"
  1319. Cbut(Ref)=2:IF Ref=8 THEN Cbut(9)=1 ELSE Cbut(8)=1
  1320. WordLen=Ref-8:' equals either a 0 for 7 bit or 1 for 8 bit
  1321. GOSUB "Update WordLen":GOSUB "UART":RETURN
  1322. '---------------------------------------------------------------
  1323. "Change StopBits"
  1324. Cbut(Ref)=2:IF Ref=10 THEN Cbut(11)=1 ELSE Cbut(10)=1
  1325. StopBit=Ref-10:' 0=1 stop, 1=2 stop bits
  1326. GOSUB "Update Stopbits":GOSUB "UART":RETURN
  1327. '---------------------------------------------------------------
  1328. "Change Parity"
  1329. FOR OldParity=12 TO 14:IF Cbut(OldParity)<>2 THEN NEXT OldParity:RETURN:' Must be found
  1330. Cbut(OldParity)=1
  1331. ON OldParity-11 GOSUB "P1","P2","P3"
  1332. Cbut(Ref)=2:ON Ref-11 GOSUB "P1","P2","P3"
  1333. GOSUB"UART":RETURN
  1334. '---------------------------------------------------------------
  1335. "Change Port"
  1336. Cbut(Ref)=2
  1337. LONG IF Ref=15
  1338.  Cbut(16)=1:SerPort=-1:' set for modem port
  1339. XELSE
  1340.  Cbut(15)=1:SerPort=-2:' set for printer port
  1341. END IF
  1342. GOSUB "Update Port":GOSUB "UART":RETURN
  1343. '---------------------------------------------------------------
  1344. "C1"
  1345.      BUTTON 1, Cbut(1):Baud=300:RETURN
  1346. "C2"
  1347.      BUTTON 2, Cbut(2):Baud=1200:RETURN
  1348. "C3"
  1349.      BUTTON 3, Cbut(3):Baud=2400:RETURN
  1350. "C4"
  1351.      BUTTON 4, Cbut(4):Baud=4800:RETURN
  1352. "C5"
  1353.      BUTTON 5, Cbut(5):Baud=7200:RETURN
  1354. "C6"
  1355.      BUTTON 6, Cbut(6):Baud=9600:RETURN
  1356. "C7"
  1357.      BUTTON 7, Cbut(7):Baud=19200:RETURN
  1358. '---------------------------------------------------------------
  1359. "Update WordLen"
  1360.      BUTTON 8, Cbut(8)
  1361.      BUTTON 9, Cbut(9)
  1362. RETURN
  1363. '---------------------------------------------------------------
  1364. "Update Stopbits"
  1365.      BUTTON 10, Cbut(10)
  1366.      BUTTON 11, Cbut(11)
  1367. RETURN
  1368. '---------------------------------------------------------------
  1369. "P1"
  1370.      BUTTON 12, Cbut(12)
  1371.      Parity=0:RETURN
  1372. "P2"
  1373.      BUTTON 13, Cbut(13)
  1374.      Parity=2:RETURN
  1375. "P3"
  1376.      BUTTON 14, Cbut(14)
  1377.      Parity=1:RETURN
  1378. '---------------------------------------------------------------
  1379. "Update Port"
  1380.      BUTTON 15, Cbut(15)
  1381.      BUTTON 16, Cbut(16)
  1382. RETURN
  1383. '---------------------------------------------------------------
  1384. "Close Cset"
  1385. FN Push(CSWIN)
  1386. FN Push(CloseEvent)
  1387. RETURN
  1388. '---------------------------------------------------------------
  1389. "Close About"
  1390.      FN Push(ABTWIN)
  1391.      FN Push(CloseEvent)
  1392. RETURN
  1393. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1394. '                     FINDER INFO Subroutines
  1395. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1396. "GetFileInfo"
  1397. '
  1398. Hparmblkptr&=VARPTR(Paramblock$)
  1399. '
  1400. Iocompletion&=0:POKE LONG Hparmblkptr&+12,Iocompletion&
  1401. '
  1402. Ionameptr&=VARPTR(MacName$)
  1403. POKE LONG Hparmblkptr&+18,Ionameptr&
  1404. '
  1405. Iovrefnum%=Vol%:POKE WORD Hparmblkptr&+22,Iovrefnum%
  1406. '
  1407. POKE WORD Hparmblkptr&+28,0
  1408. POKE WORD Hparmblkptr&+48,0
  1409. '
  1410. Oserr=FN GETFILEINFO(Hparmblkptr&)
  1411. '
  1412. Ioresult%=PEEK WORD(Hparmblkptr&+16)
  1413. IF Ioresult%<>0 THEN BEEP:RETURN:' back if it was an error read
  1414. '
  1415. OldFlags%=PEEK WORD(Hparmblkptr&+40):' finder attribute flags (HI/LO byte)
  1416. RETURN
  1417. '---------------------------------------------------------------
  1418. "SetFileInfo"
  1419. POKE WORD(Hparmblkptr&+40),FindrFlags%:' update the finder flags
  1420. '
  1421. Oserr=FN SETFILEINFO(Hparmblkptr&)
  1422. '
  1423. Ioresult%=PEEK WORD(Hparmblkptr&+16)
  1424. IF Ioresult%<>0 THEN BEEP:RETURN:' back if it was an error write
  1425. RETURN
  1426. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1427. '                     • UART CONTROL •
  1428. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1429. "UART"
  1430. OPEN "C",SerPort,Baud,Parity,StopBit,WordLen,BufLen
  1431. HANDSHAKE SerPort,0:' set for no handshaking
  1432. RETURN
  1433. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1434. '                     • HANDLE RECVD CHARACTERS  •
  1435. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1436. "RECV1"
  1437. LONG IF ASC(RX$)>128 
  1438.  CV=ASC(RX$):CV=CV AND 127:RX$=CHR$(CV):' simply stripes HIGH bit
  1439. END IF
  1440. '
  1441. IF ASC(RX$)=0 THEN RETURN:' dont allow NULLS to come through
  1442. '
  1443. LONG IF ASC(RX$)<32:' test to see if we are getting a control code
  1444.  CV=ASC(RX$):' get the current control value
  1445.  RX$=MID$(Control$,CV,1):' get allowable control codes from string
  1446.  IF ASC(RX$)=0 THEN RETURN:' dont allow codes we haven't defined
  1447. END IF
  1448. '
  1449. IF ASC(RX$)=127 THEN RX$=CHR$(8):' change DELETE to backspace
  1450. '
  1451. LONG IF WINDOW(0)=COMWIN AND CapFlag=1
  1452. PRINT #2,RX$;:' routine to write capture text to file
  1453. END IF
  1454. '
  1455. IF Tbut(8) THEN PRINT #SerPort,RX$;
  1456. "RECV"
  1457. LONG IF RX$=CHR$(8)
  1458. X=POS(0):GOSUB "OFF":IF ChrCnt=0 THEN GOSUB "ON":RETURN
  1459. ChrCnt=ChrCnt-1
  1460. SELECT ChrCnt
  1461. CASE 0
  1462. Screen$(Y)="":' empty string on full backspace
  1463. CASE >0
  1464. Screen$(Y)=LEFT$(Screen$(Y),ChrCnt)
  1465. END SELECT
  1466. GOTO "BACKSPACE"
  1467. END IF
  1468. '
  1469. LONG IF RX$=CHR$(7)
  1470. BEEP:GOSUB "ON":RETURN
  1471. END IF
  1472. '
  1473. LONG IF RX$=CHR$(10)
  1474. GOSUB "ON":RETURN
  1475. END IF
  1476. '
  1477. X=POS(0):GOSUB "OFF":PRINT RX$;:ChrCnt=ChrCnt+1
  1478. LONG IF RX$=CHR$(13)
  1479. IF ChrCnt=1 THEN Screen$(Y)=""
  1480. Y=Y+1:ChrCnt=0
  1481. XELSE
  1482. Screen$(Y)=Screen$(Y)+RX$: ' adds the printed character to the buffer
  1483. END IF
  1484. '
  1485. IF ChrCnt=CntMax THEN RX$=CHR$(13):GOTO "RECV":'do an autolinefeed
  1486. LONG IF Y>TSLines
  1487. Y=TSLines
  1488.  FOR T=1 TO TSLines-1:SWAP Screen$(T),Screen$(T+1):NEXT T
  1489.  Screen$(TSLines)=""
  1490. END IF
  1491. '
  1492. GOSUB "ON":' turn on cursor again
  1493. RETURN
  1494. '------------------------------------------------------------
  1495. "BACKSPACE"
  1496. X=POS(0):LOCATE X-1,Y
  1497. TEXT GFFont,GFSize,GFFace,7:PRINT " ";:LOCATE X-1,Y
  1498. TEXT GFFont,GFSize,GFFace,1:GOSUB "ON":RETURN
  1499. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1500. '                     • CONTROL THE CURSOR  •
  1501. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1502. "ON"
  1503. IF Wink=1 THEN RETURN:' back if already on
  1504. X=POS(0):LOCATE X,Y
  1505. "ON1"
  1506. TEXT GFFont,GFSize,GFFace,TMode:PRINT Cur$;
  1507. LOCATE X,Y:Wink=1
  1508. RETURN
  1509. '------------------------------------------------------------
  1510. "OFF"
  1511. IF Wink=0 THEN RETURN:' back if already off
  1512. LOCATE X,Y
  1513. TEXT GFFont,GFSize,GFFace,7:PRINT " ";
  1514. LOCATE X,Y
  1515. TEXT GFFont,GFSize,GFFace,1:Wink=0
  1516. RETURN
  1517. '------------------------------------------------------------
  1518. "Blink"
  1519.  IF WINDOW(0)=RECWIN THEN GOSUB "Check_Receive":' if receiving
  1520. '
  1521. IF SendFlag=1 THEN RETURN:' back if sending text to remote
  1522. '
  1523. LONG IF WINDOW(0)=COMWIN AND EnBlink=1
  1524. SELECT Wink
  1525.  CASE 0
  1526.   GOSUB "ON":' turn on cursor
  1527.  CASE 1
  1528.   GOSUB "OFF":' turn off cursor
  1529. END SELECT
  1530. END IF
  1531. RETURN
  1532. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1533. "Menu"
  1534. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1535.  MenuID=MENU(0):ItemID=MENU(1)
  1536. '---------------------------------------------------------------
  1537.  LONG IF MenuID = 255:'                              Apple menu
  1538.  FN Push (ABTWIN):' about window
  1539.  FN Push (OpenEvent):' and open it
  1540.  RETURN
  1541.  END IF
  1542. '---------------------------------------------------------------
  1543.  ON MenuID-127 GOSUB "File","Settings","Transfers"
  1544. CALL HILITEMENU(MenuUsed&):RETURN
  1545. '---------------------------------------------------------------
  1546. "File"
  1547. MenuUsed&=FileMenu&
  1548.  ON ItemID GOTO "Open Settings","Save Settings","ClearScrn","X","Quit"
  1549. '---------------------------------------------------------------
  1550. "Settings"
  1551. MenuUsed&=SetMenu&
  1552.  ON ItemID GOTO "TermSet","ComSet","TranSet"
  1553. '---------------------------------------------------------------
  1554. "Transfers"
  1555. MenuUsed&=ProMenu&
  1556.  ON ItemID GOTO "SendASCII","Capture Text","XSend","XRecv"
  1557. '---------------------------------------------------------------
  1558. "Capture Text"
  1559.  ProHndl&=FN GETMHANDLE(130):' get a pointer to the menu handle
  1560. SELECT CapFlag
  1561.   CASE 0
  1562.     CALL SETITEM(ProHndl&,2,"Stop Capture...")
  1563.     F$=FILES$(0,"Save Configuration as...","Log File",Vol%)
  1564.      LONG IF F$<>""
  1565.      SELECT
  1566.       CASE Pbut(1)=2
  1567.        DEF OPEN="TEXTMSWD"
  1568.       CASE Pbut(2)=2
  1569.        DEF OPEN="TEXTMACA"
  1570.       CASE Pbut(3)=2
  1571.        DEF OPEN="TEXTnX^n"
  1572.       CASE Pbut(4)=2
  1573.        DEF OPEN="TEXTFAST"
  1574.      END SELECT
  1575.       OPEN "O",2,F$,,Vol%:' set up file for writing to
  1576.       DEF OPEN="TEXTBTRM"
  1577.       CapFlag=1:' turn on flag to tell us whats happening
  1578.      END IF
  1579.   CASE 1
  1580.     CALL SETITEM(ProHndl&,2,"Capture Text...")
  1581.      CLOSE #2:CapFlag=0
  1582. END SELECT
  1583. RETURN
  1584. '---------------------------------------------------------------
  1585. "SendASCII"
  1586. ProHndl&=FN GETMHANDLE(130)
  1587. SELECT SendFlag
  1588.   CASE 0
  1589.    CALL SETITEM(ProHndl&,1,"Stop Send...")
  1590.     F$=FILES$(1,"TEXT",,Vol%)
  1591.     LONG IF F$<>""
  1592.      OPEN "I",3,F$,,Vol%
  1593.      SendFlag=1:More=1
  1594.     END IF
  1595.   CASE 1
  1596.    CALL SETITEM(ProHndl&,1,"Send Text...")
  1597.     CLOSE #3:SendFlag=0
  1598. END SELECT
  1599. RETURN
  1600. '---------------------------------------------------------------
  1601. "XSend"
  1602. MacName$=FILES$(1,"",,Vol%):' ask for the filename to send
  1603. IF MacName$="" THEN RETURN
  1604. '
  1605. OPEN "ID",1,MacName$,,Vol%:' open the file to send
  1606. DataFork&=LOF(1,1):' read the length of the fork
  1607. CLOSE #1:' then close the file
  1608. '
  1609. OPEN "IR",1,MacName$,,Vol%:' open the resource fork of the file
  1610. ResFork&=LOF(1,1):' read in the size of the resource fork
  1611. CLOSE #1:' then close the file again
  1612. '
  1613. IF DataFork&<>0 THEN HasData=True ELSE HasData=False:' set flags
  1614. IF ResFork&<>0 THEN HasRes=True ELSE HasRes=False:' for both forks
  1615. TotalSize&=(((DataFork&+ResFork&)\128)+.5)*128:' used for graphing the send
  1616. '
  1617. GOSUB "Encode_MacBinary":' do this as a default
  1618. '
  1619. FN Push(SNDWIN):FN Push(OpenEvent):' open up the new window
  1620. '
  1621.      CRC=False:' turn off sending CRC protocol
  1622.      SUM=False:' turn off checksum protocol
  1623.      Xmit_Step=1:' tells routine where in procedure we are
  1624.      Time_Out=0:' sets the time out to zero for routine start
  1625.      Recv_Error=0:' set total errors to 0
  1626.      TotalBytes&=0:' set amount sent to null
  1627.      XmitBytes&=0:' set amount sent per fork to zero
  1628.      Count=0:' used for reading data from the disk file
  1629.      Abort=False:' used in event trapping to cancel routine
  1630.      Retry=False:' bad block flag
  1631.      XmitBlock=1:' block number counter (8 bits only)
  1632.      BlockCount=1:' used for a total block count
  1633.      SecPass=False:' flag so we don't reopen after all is sent
  1634.      CurStep=0:' value used for spinning beach ball
  1635. RETURN
  1636. '--------------------------------------------------------------
  1637. "XRecv"
  1638. FN Push (RECWIN)
  1639. FN Push (OpenEvent):' opens up my window (receive window)
  1640.      Recv_Step=1:' set for start of receiving routine to start
  1641.      Time_Out=0:' set the time out value for the initial start
  1642.      Recv_Error=0:' set for no errors during receive
  1643.      TotalBytes&=0:' set amount received to null
  1644.      RecvBytes&=0:' set amount for each fork to zilch too!
  1645.      Count=0
  1646.      Abort=False:' used for user cancelled receiving
  1647.      Retry=False
  1648.      RecBlock=1
  1649.      BlockCount=1
  1650.      MacBin=False
  1651.      Complete=False:'used for MacBinary to stop writing on full length
  1652.      SecPass=False:' for both fork writing
  1653.      CurStep=0:' setup for the spinning cursor beachball
  1654. RETURN
  1655. '--------------------------------------------------------------
  1656. "TranSet"
  1657. FN Push (PROSET)
  1658. FN Push (OpenEvent)
  1659. FOR T=1 TO 7:Hold(T)=Pbut(T):NEXT T:' get temp stuff
  1660. RETURN
  1661. '---------------------------------------------------------------
  1662. "Open Settings"
  1663. GOSUB "Load Uart":RETURN
  1664. '---------------------------------------------------------------
  1665. "Save Settings"
  1666. GOSUB "Save Uart":RETURN
  1667. '---------------------------------------------------------------
  1668. "ClearScrn"
  1669. FN Push (COMWIN):'                     then reopen it
  1670. FN Push (OpenEvent):
  1671. FN Push (COMWIN):'                     Close the Communications window first
  1672. FN Push (CloseEvent):'            close my window first
  1673. RETURN
  1674. '---------------------------------------------------------------
  1675. "Quit" GOTO "Break"
  1676. '---------------------------------------------------------------
  1677. "TermSet"
  1678.  FN Push(TSWIN):'                     Push first window on to stack
  1679.  FN Push(OpenEvent):'             Tell my event manager to open the window
  1680. FOR T=1 TO 10
  1681. Hold(T)=Tbut(T)
  1682. NEXT T:'                          Get current terminal values
  1683. RETURN
  1684. '---------------------------------------------------------------
  1685. "ComSet"
  1686. FOR T=1 TO 16
  1687. Hold(T)=Cbut(T)
  1688. NEXT T:'                          Get current communication values
  1689.  FN Push(CSWIN):'                     Push first window on to stack
  1690.  FN Push(OpenEvent):'             Tell my event manager to open the window
  1691. RETURN
  1692. '---------------------------------------------------------------
  1693. "X"                      RETURN
  1694. '---------------------------------------------------------------
  1695. "Save Uart"
  1696. DEF OPEN="CNFGBTRM"
  1697. F$=FILES$(0,"Save Configuration as...","Default Settings",Vol%)
  1698. IF F$="" THEN RETURN:' back if CANCEL was selected
  1699. CURSOR=Watch:' show the watch cursor
  1700. OPEN "O",1,F$,,Vol%
  1701. "Save_Config"
  1702. FOR T=1 TO 10
  1703. WRITE #1,Tbut(T)
  1704. NEXT T:' writes out the terminal settings
  1705. FOR T=1 TO 16
  1706. WRITE #1,Cbut(T)
  1707. NEXT T:' writes out the UART settings
  1708. FOR T=1 TO 7
  1709. WRITE #1,Pbut(T)
  1710. NEXT T:' writes out the transfer settings
  1711. Cur=ASC(Cur$):' get the cursor currently being used
  1712. WRITE #1,GFSize,Cur,TMode:' writes out the current font size
  1713. WRITE #1,SerPort,Baud,Parity,StopBit,WordLen
  1714. CLOSE #1:' then close the file
  1715. CURSOR=Arrow:' return to the arrow cursor
  1716. RETURN
  1717. '---------------------------------------------------------------
  1718. "Load Uart"
  1719. DEF OPEN="CNFGBTRM"
  1720. F$=FILES$(1,"CNFG",,Vol%)
  1721. IF F$="" THEN RETURN:' back if cancel selected
  1722. "Read_Config"
  1723. LONG IF Flag=1
  1724. OPEN "I",1,"Default Settings":' uses a default name
  1725.  IF ERROR GOSUB "No_Default":RETURN
  1726. XELSE
  1727. OPEN "I",1,F$,,Vol%
  1728. END IF
  1729. CURSOR=Watch:' enable the watch cursor
  1730.  FOR T=1 TO 10
  1731.   READ #1,Tbut(T)
  1732.  NEXT T:' reads in the terminal settings
  1733.  FOR T=1 TO 16
  1734.   READ #1,Cbut(T)
  1735.  NEXT T:' reads in the UART settings
  1736.  FOR T=1 TO 7
  1737.   READ #1,Pbut(T)
  1738.  NEXT T:' reads in the transfer settings
  1739. READ #1,GFSize,Cur,TMode:' reads in the current font size
  1740. Cur$=CHR$(Cur):' get the cursor
  1741. READ #1,SerPort,Baud,Parity,StopBit,WordLen
  1742. CLOSE #1:' then close the file
  1743. GOSUB "UART":' reconfigure the UART settings
  1744. CURSOR=Arrow:' then change cursor back to an arrow
  1745. IF Flag=1 THEN Flag=0:RETURN:' don't open the windows if loading directly
  1746. FN Push (COMWIN):' set up events to close and open window for new
  1747. FN Push (OpenEvent):' settings to take effect
  1748. FN Push (COMWIN)
  1749. FN Push (CloseEvent)
  1750. RETURN
  1751. '---------------------------------------------------------------
  1752. "No_Default"
  1753. CURSOR=Watch:' change the cursor first
  1754. OPEN"O",1,"Default Settings":' filename to create
  1755. GOSUB"Save_Config":' write out the info to disk file
  1756. RETURN:' then back to routines
  1757. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1758. "Break"
  1759. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1760. '
  1761. '
  1762. IF WINDOW(0) THEN FN Push(BreakEvent):RETURN
  1763. '
  1764.  CALL RELEASERESOURCE(FileMenu&):' we release menu resources
  1765.  CALL RELEASERESOURCE(SetMenu&)
  1766.  CALL RELEASERESOURCE(ProMenu&)
  1767. '
  1768. IF ResRef<>0 THEN CALL CLOSERESFILE(ResRef)
  1769. IF CapFlag=1 THEN CLOSE #2:' make sure file is closed
  1770. IF SendFlag=1 THEN CLOSE #3:' turn off all file sending
  1771. '
  1772. END
  1773. '
  1774. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1775. SEGMENT:' start to split things up here
  1776. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1777. '
  1778. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1779. 'Window Routines
  1780. '›››œœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœœ›››
  1781. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  1782. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  1783. "Build"
  1784. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  1785. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  1786.  Wnd2Build = FN Pop:'                   Pop window # from stack
  1787.  SELECT Wnd2Build
  1788.    CASE COMWIN
  1789.              WINDOW Wnd2Build,"BasicTerm",(ScrnL+10,ScrnT+45)-(ScrnR-10,ScrnB-8),5
  1790.       FN GetFht(GFFont,GFSize,GFFace,GFMode)
  1791.       TSLines=(((ScrnB-10)-(ScrnT+45))/(FAsc+FDes+FLead))-1
  1792.       FOR T=0 TO TSLines:Screen$(T)="":NEXT T:' clear out array on open
  1793.      CLS:Y=0:X=0:LOCATE X,Y:ChrCnt=0:GOSUB "ON":CURSOR=Arrow
  1794. '
  1795.    CASE TSWIN
  1796.      T = 0:L = 0:B = 246:R = 397:Refresh=0:'      Set TLBR to window size
  1797. '                   Offset the rect to the center of the screen
  1798.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1799.      WINDOW Wnd2Build,"TRMWIN",(L,T)-(R,B),-2
  1800.      BUTTON 1, Tbut(1),"9",( 149, 44)-( 187, 60),3
  1801.      BUTTON 2, Tbut(2),"12",( 271, 44)-( 314, 60),3
  1802.      BUTTON 3, Tbut(3),"Block",( 149, 75)-( 209, 91),3
  1803.      BUTTON 4, Tbut(4),"Underline",( 217, 74)-( 304, 90),3
  1804.      BUTTON 5, Tbut(5),"Backspace",( 149, 106)-( 240, 122),3
  1805.      BUTTON 6, Tbut(6),"Delete",( 271, 106)-( 339, 122),3
  1806.      BUTTON 7, Tbut(7)+1,"Local",( 149, 137)-( 208, 153),2
  1807.      BUTTON 8, Tbut(8)+1,"Remote",( 271, 137)-( 343, 153),2
  1808.      BUTTON 9, Tbut(9)+1,"Add Linefeeds",(149,168)-(262,184),2
  1809.      BUTTON 10, 1,"OK",( 291, 214)-( 385, 234),1
  1810.      BUTTON 11,1,"Cancel",( 15, 215)-( 106, 235),1
  1811.      BUTTON 12, Tbut(10),"Blinking",( 315, 74)-( 391, 90),3
  1812. '
  1813.    CASE CSWIN
  1814.      T = 0:L = 0:B = 247:R = 406:Refresh=0:'      Set TLBR to window size
  1815. '                   Offset the rect to the center of the screen
  1816.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1817.      WINDOW Wnd2Build,"SETWIN",(L,T)-(R,B),-2
  1818.      BUTTON 1, Cbut(1),"300",( 136, 31)-( 185, 47),3
  1819.      BUTTON 2, Cbut(2),"1200",( 136, 55)-( 191, 71),3
  1820.      BUTTON 3, Cbut(3),"2400",( 136, 79)-( 198, 95),3
  1821.      BUTTON 4, Cbut(4),"4800",( 226, 31)-( 283, 47),3
  1822.      BUTTON 5, Cbut(5),"7200",( 226, 56)-( 277, 72),3
  1823.      BUTTON 6, Cbut(6),"9600",( 226, 79)-( 285, 95),3
  1824.      BUTTON 7, Cbut(7),"19,200",( 315, 31)-( 385, 47),3
  1825.      BUTTON 8, Cbut(8),"7",( 132, 108)-( 196, 124),3
  1826.      BUTTON 9, Cbut(9),"8",( 227, 107)-( 290, 123),3
  1827.      BUTTON 10, Cbut(10),"1",( 132, 140)-( 187, 156),3
  1828.      BUTTON 11, Cbut(11),"2",( 227, 139)-( 291, 155),3
  1829.      BUTTON 12, Cbut(12),"None",( 132, 171)-( 193, 187),3
  1830.      BUTTON 13, Cbut(13),"Even",( 227, 170)-( 282, 186),3
  1831.      BUTTON 14, Cbut(14),"Odd",( 315, 170)-( 363, 186),3
  1832.      BUTTON 15, Cbut(15),"Modem",( 132, 205)-( 202, 221),3
  1833.      BUTTON 16, Cbut(16),"Printer",( 227, 206)-( 295, 222),3
  1834.      BUTTON 17, 1,"OK",( 341, 223)-( 396, 243),1
  1835.      BUTTON 18, 1,"Cancel",( 9, 223)-( 68, 243),1
  1836. '
  1837.    CASE SNDWIN
  1838.      T = 0:L = 0:B = 261:R = 442:'      Set TLBR to window size
  1839.       BLOCKMOVE VARPTR(T),VARPTR(Mt),8:' shovel to my checking
  1840. '                   Offset the rect to the center of the screen
  1841.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1842.      WINDOW Wnd2Build,"Xmodem Send",(L,T)-(R,B),-5
  1843. '
  1844.    CASE RECWIN
  1845.      T = 0:L = 0:B = 261:R = 442:'      Set TLBR to window size
  1846.       BLOCKMOVE VARPTR(T),VARPTR(Mt),8:' shovel to my checking
  1847. '                   Offset the rect to the center of the screen
  1848.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1849.      WINDOW Wnd2Build,"Xmodem Receive",(L,T)-(R,B),-5
  1850. '
  1851.    CASE PROSET
  1852.      T = 0:L = 0:B = 155:R = 377:Refresh=0:'      Set TLBR to window size
  1853. '                   Offset the rect to the center of the screen
  1854.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1855.      WINDOW Wnd2Build,"ProSet",(L,T)-(R,B),-2
  1856.      BUTTON 1, Pbut(1),"MSWord 4",( 4, 55)-( 89, 71),3
  1857.      BUTTON 2, Pbut(2),"MacWrite",( 108, 55)-( 195, 71),3
  1858.      BUTTON 3, Pbut(3),"WriteNow!",( 212, 55)-( 310, 71),3
  1859.      BUTTON 4, Pbut(4),"TEXT",( 316, 55)-( 370, 71),3
  1860.      BUTTON 5, Pbut(5),"CRC",( 5, 103)-( 57, 119),3
  1861.      BUTTON 6, Pbut(6),"Checksum",( 121, 104)-( 218, 120),3
  1862.      BUTTON 7, Pbut(7),"MacBinary",( 277, 104)-( 373, 120),2
  1863.      BUTTON 8, 1,"OK",( 300, 129)-( 362, 149),1
  1864.      BUTTON 9, 1,"Cancel",( 9, 133)-( 65, 153),1
  1865. '
  1866.    CASE ABTWIN
  1867.      T = 0:L = 0:B = 255:R = 424:'      Set TLBR to window size
  1868. '                   Offset the rect to the center of the screen
  1869.      CALL OFFSETRECT(T,ScrnR/2-R/2,(ScrnB/2+8)-B/2)
  1870.      WINDOW Wnd2Build,"ABOUTWIN",(L,T)-(R,B),-4
  1871.      BUTTON 1, 1,"OK",( 344, 224)-( 410, 244),1
  1872.  END SELECT
  1873. '
  1874. '                              Add window color table to window
  1875. '
  1876.  LONG IF FN CheckColor
  1877.    X = FN GETAUXWIN(WINDOW(14),Hndl&)
  1878.    H& = FN GETRESOURCE(CVI("wctb"),1000+WINDOW(0))
  1879.    LONG IF NOT FN RESERROR
  1880.      Hndl& = FN NEWHANDLE(48)
  1881.      LONG IF Hndl&
  1882.        BLOCKMOVE PEEK LONG(H&),PEEK LONG(Hndl&),48
  1883.        CALL RELEASERESOURCE(H&)
  1884.        CALL SETWINCOLOR(WINDOW(14),Hndl&)
  1885.        WINDOW Wnd2Build:WINDOW OUTPUT Wnd2Build
  1886.      END IF
  1887.    END IF
  1888.  END IF
  1889. '
  1890. RETURN
  1891. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  1892. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  1893. "Format Wnd"
  1894. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  1895. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  1896. '
  1897.  ColorOn = FN CheckColor:'                  Is color turned on?
  1898. '
  1899.  LONG IF ColorOn
  1900.    CALL GETFORECOLOR(RFore):'   Record current foreground color
  1901.    CALL GETBACKCOLOR(RBack):'   Record current background color
  1902.  END IF
  1903. '
  1904.  CALL GETPENSTATE(PenSpecs$):'     Record the current pen state
  1905. '
  1906. '                                 Record the current font specs
  1907.  TxFont=PEEK WORD(WINDOW(14)+68)
  1908.  TxFace=PEEK WORD(WINDOW(14)+70)
  1909.  TxMode=PEEK WORD(WINDOW(14)+72)
  1910.  TxSize=PEEK WORD(WINDOW(14)+74)
  1911. '
  1912. '
  1913. LONG IF WINDOW(1) = COMWIN
  1914. TEXT GFFont,GFSize,GFFace,1
  1915. LONG IF ChrCnt<>0 OR Y<>0
  1916. CLS:' Clear the video display to redraw the window
  1917. LOCATE 0,0:' have to make sure of start position
  1918. SL=0:' Starting Line
  1919. IF Y=0 THEN GOTO "SkipLines"
  1920. "ReDisp"
  1921. PRINT Screen$(SL)
  1922. SL=SL+1:IF SL<>Y THEN GOTO "ReDisp"
  1923. "SkipLines"
  1924. FOR T=1 TO LEN(Screen$(SL)):PRINT MID$(Screen$(SL),T,1);:NEXT T
  1925. X=POS(0):Y=SL:LOCATE X,Y
  1926. GOSUB "ON1":' restore cursor location and turn it back on
  1927. XELSE
  1928. GOSUB "ON"
  1929. END IF
  1930. END IF
  1931. '
  1932.  LONG IF WINDOW(1) = TSWIN AND Refresh=0
  1933.    T = 11:L = 14:B = 27:R = 212
  1934.    LONG IF ColorOn
  1935.      Red = 0:Green = 0:Blue = 0
  1936.      CALL RGBFORECOLOR(Red)
  1937.      Red =-1:Green =-1:Blue =-1
  1938.      CALL RGBBACKCOLOR(Red)
  1939.    END IF
  1940.    TEXT 0,12,0,0
  1941.    Temp$ = "Terminal Settings :"
  1942.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1943.    T = 42:B = 200:R = 128
  1944.    Temp$ = "Font Size :"+Cr$+""+Cr$+"Cursor Shape :"+Cr$+""+Cr$+"Backspace Key :"+Cr$+""+Cr$+"Echo :"+Cr$+""+Cr$+"LineFeeds : "
  1945.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1946.    Refresh=1:' don't update this window anymore
  1947.  END IF:'                                   End of TSWIN format
  1948. '
  1949. '
  1950.  LONG IF WINDOW(1) = CSWIN AND Refresh=0
  1951.    T = 7:L = 5:B = 23:R = 180
  1952.    LONG IF ColorOn
  1953.      Red = 0:Green = 0:Blue = 0
  1954.      CALL RGBFORECOLOR(Red)
  1955.      Red =-1:Green =-1:Blue =-1
  1956.      CALL RGBBACKCOLOR(Red)
  1957.    END IF
  1958.    TEXT 0,12,0,0
  1959.    Temp$ = "Communications Settings"
  1960.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1961.    T = 33:L = 18:B = 49:R = 116
  1962.    Temp$ = "Baud Rate"
  1963.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1964.    T = 107:B = 219:R = 112
  1965.    Temp$ = "Word Length :"+Cr$+""+Cr$+"Stop Bits :"+Cr$+""+Cr$+"Parity :"+Cr$+""+Cr$+"Port :"
  1966.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1967.    Refresh=1:' don't update this window anymore
  1968.  END IF:'                                   End of CSWIN format
  1969. '
  1970.  LONG IF WINDOW(1) = SNDWIN
  1971.    LONG IF ColorOn
  1972.      Red = 0:Green = 0:Blue = 0
  1973.      CALL RGBFORECOLOR(Red)
  1974.      Red =-1:Green =-1:Blue =-1
  1975.      CALL RGBBACKCOLOR(Red)
  1976.    END IF
  1977.    TEXT 0,12,,0
  1978.    T = 8:L = 76:B = 24:R = 148
  1979.    Temp$ = "Filename : "
  1980.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1981.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1982.    T = 44:L = 35:B = 60:R = 145
  1983.    Temp$ = "    Bytes Sent :"
  1984.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1985.    T = 64:L = 61:B = 80:R = 146
  1986.    Temp$ = "File Format :"
  1987.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1988.    T = 84:L = 6:B = 100:R = 147
  1989.    Temp$ = "Transmission Errors :"
  1990.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1991.     GOSUB "Show_Error"
  1992.    T = 111:L = 93:B = 127:R = 146
  1993.    Temp$ = "Status :"
  1994.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1995.    L = 150:R = 282
  1996.    Temp$ = "Waiting for Start"
  1997.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  1998.    T = 131:L = 78:B = 147:R = 145
  1999.    Temp$ = "File Type :"
  2000.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2001.    T = 151:L = 58:B = 167
  2002.    Temp$ = "File Creator :"
  2003.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2004.     GOSUB "Show_CreatorType":' show what type and creator we are sending
  2005.     GOSUB "Show_Name":' show the name of the file we are going to send
  2006.  END IF:'                                    END Of SNDWIN Format
  2007. '
  2008.  LONG IF WINDOW(1) = RECWIN
  2009.    LONG IF ColorOn
  2010.      Red = 0:Green = 0:Blue = 0
  2011.      CALL RGBFORECOLOR(Red)
  2012.      Red =-1:Green =-1:Blue =-1
  2013.      CALL RGBBACKCOLOR(Red)
  2014.    END IF
  2015.    TEXT 0,12,,0
  2016.    T = 8:L = 76:B = 24:R = 148
  2017.    Temp$ = "Filename : "
  2018.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2019.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2020.    T = 44:L = 35:B = 60:R = 145
  2021.    Temp$ = "Bytes Received :"
  2022.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2023.    T = 64:L = 61:B = 80:R = 146
  2024.    Temp$ = "File Format :"
  2025.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2026.    T = 84:L = 6:B = 100:R = 147
  2027.    Temp$ = "Transmission Errors :"
  2028.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2029.     GOSUB "Show_Error"
  2030.    T = 111:L = 93:B = 127:R = 146
  2031.    Temp$ = "Status :"
  2032.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2033.    L = 150:R = 282
  2034.    Temp$ = "Waiting for SOH"
  2035.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2036.    T = 131:L = 78:B = 147:R = 145
  2037.    Temp$ = "File Type :"
  2038.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2039.    T = 151:L = 58:B = 167
  2040.    Temp$ = "File Creator :"
  2041.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2042.  END IF:'                                  End of RECWIN format
  2043. '
  2044.  LONG IF WINDOW(1) = PROSET AND Refresh=0
  2045.    T = 3:L = 115:B = 27:R = 242
  2046.    LONG IF ColorOn
  2047.      Red = 0:Green = 0:Blue = 0
  2048.      CALL RGBFORECOLOR(Red)
  2049.      Red =-1:Green =-1:Blue =-1
  2050.      CALL RGBBACKCOLOR(Red)
  2051.    END IF
  2052.    CALL PENNORMAL:'         If you haven't installed the proper
  2053.    DEF SHADOWBOX(T):'            ZMover library-this won't work
  2054.    T = 6:L = 120:B = 22:R = 241
  2055.    TEXT 0,12,0,0
  2056.    Temp$ = "Protocol Settings"
  2057.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2058.    T = 34:L = 5:B = 50:R = 236
  2059.    Temp$ = "Default Type/Creator text files..."
  2060.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2061.    T = 87:L = 8:B = 103:R = 239
  2062.    Temp$ = "Default Xmodem File Transfer"
  2063.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2064.    T = 80:L = 2:B = 80:R = 372
  2065.    PEN 1,1,1,8,0
  2066.    CALL MOVETO(L,T):CALL LINETO(R,B)
  2067.    T = 125:L = 296:B = 153:R = 366
  2068.    FN FrameBtn("OK")
  2069.  END IF:'                                    End of PROSET format
  2070. '
  2071.  LONG IF WINDOW(1) = ABTWIN
  2072.    T = 15:L = 20:B = 31:R = 216
  2073.    LONG IF ColorOn
  2074.      Red = 0:Green = 0:Blue = 0
  2075.      CALL RGBFORECOLOR(Red)
  2076.      Red =-1:Green =-1:Blue =-1
  2077.      CALL RGBBACKCOLOR(Red)
  2078.    END IF
  2079.    TEXT 0,12,0,0
  2080.    Temp$ = "BTerm"
  2081.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2082.    T = 81:L = 27:B = 129:R = 398
  2083.    Temp$ = "BTerm - A Simple Terminal Program written entirely with ZBasic 5.01"
  2084.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2085.    T = 144:L = 23:B = 192:R = 393
  2086.    TEXT 3,,,0
  2087.    Temp$ = "BTerm Copyright 1991 by Mel Patrick"
  2088.    CALL TEXTBOX(VARPTR(Temp$)+1,LEN(Temp$),T, 0)
  2089.    T = 220:L = 340:B = 248:R = 414
  2090.    FN FrameBtn("OK")
  2091.  END IF:'                                  End of ABTWIN format
  2092. '
  2093. '
  2094. TEXT TxFont,TxSize,TxFace,TxMode:'       Restore the font specs
  2095. '
  2096.  CALL SETPENSTATE(PenSpecs$):'                  Restore the pen
  2097. '
  2098.  LONG IF ColorOn
  2099.    CALL RGBFORECOLOR(RFore):'      Restore the foreground color
  2100.    CALL RGBBACKCOLOR(RBack):'      Restore the background color
  2101.  END IF
  2102. '
  2103. RETURN
  2104. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  2105. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  2106. "Capture"
  2107. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  2108. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  2109.  LONG IF WINDOW(0) = TSWIN
  2110. '   <-- Insert WINDOW 2  capture routines here
  2111.  END IF
  2112. '
  2113.  LONG IF WINDOW(0) = CSWIN
  2114. '   <-- Insert WINDOW 3  capture routines here
  2115.  END IF
  2116. '
  2117.  LONG IF WINDOW(0) = SNDWIN
  2118. '   <-- Insert WINDOW 4  capture routines here
  2119.  END IF
  2120. RETURN
  2121. '
  2122.  LONG IF WINDOW(0) = RECWIN
  2123. '   <-- Insert WINDOW 5  capture routines here
  2124.  END IF
  2125. RETURN
  2126. '
  2127.  LONG IF WINDOW(0) = PROSET
  2128. '   <-- Insert WINDOW 6  capture routines here
  2129.  END IF
  2130. '
  2131.  LONG IF WINDOW(0) = ABTWIN
  2132. '   <-- Insert WINDOW 7  capture routines here
  2133.  END IF
  2134. RETURN
  2135. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  2136. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  2137. "Initialize"
  2138. '”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’”’’
  2139. '““‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘“‘
  2140.  FN Push(COMWIN):'                     Push first window on to stack
  2141.  FN Push(OpenEvent):'  Tell my event manager to open the window
  2142. APPLE MENU="About BTerm"
  2143. '
  2144. FileMenu&=FN GETMENU(128):' gets the file menu from resource file
  2145. CALL INSERTMENU(FileMenu&,0)
  2146. SetMenu&=FN GETMENU(129):' gets the settings menu
  2147. CALL INSERTMENU(SetMenu&,0)
  2148. ProMenu&=FN GETMENU(130):' gets the transfer menu
  2149. CALL INSERTMENU(ProMenu&,0)
  2150. '
  2151.  LONG IF FN CheckColor
  2152. '                          Get a handle to the menu color table
  2153.    Hndl& = FN GETRESOURCE(CVI("mctb"),1000)
  2154.    OSErr=FN HLOCK(Hndl&):'                              Lock it
  2155.    Ptr&=PEEK LONG(Hndl&):'           Get a pointer to the block
  2156.    Cnt=PEEK WORD(Ptr&):'               First word is item count
  2157.    Ptr&=Ptr&+2:'                        Move pointer past count
  2158.    CALL SETMCENTRIES(Cnt,Ptr&):'                Set the entries
  2159.    OSErr=FN HUNLOCK(Hndl&):'                   Unlock the block
  2160.    CALL RELEASERESOURCE(Hndl&):'                    Free up mem
  2161.  END IF
  2162.    CALL DRAWMENUBAR:'                            Redraw the bar
  2163. RETURN
  2164. '
  2165.